【发布时间】:2015-09-03 12:06:49
【问题描述】:
在一个小部件中,我放置了两个 QPushButton(比如说“OK”在左边,“EXIT”在右边)。 当我使用鼠标按下它们时,它们会定期工作。 假设我想使用 TAB 键从一个切换到另一个:可能吗? 以及如何做到这一点?
【问题讨论】:
-
它不会自动工作吗?
-
@Lol4t0 取决于平台。
标签: qt qpushbutton
在一个小部件中,我放置了两个 QPushButton(比如说“OK”在左边,“EXIT”在右边)。 当我使用鼠标按下它们时,它们会定期工作。 假设我想使用 TAB 键从一个切换到另一个:可能吗? 以及如何做到这一点?
【问题讨论】:
标签: qt qpushbutton
在某些平台上,按钮之间的键盘焦点导航是默认行为,但在某些平台上不是。
如果您希望在所有平台上使用键盘导航,则应为按钮设置Qt::StrongFocus 策略。请注意,用于触发按钮的快捷方式也是特定于平台的。例如。在 OS X 上,你会使用 Space。
#include <QtWidgets>
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QWidget w;
QVBoxLayout layout{&w};
// Individual Buttons
QPushButton p1{"button1"}, p2{"button2"};
for (auto p : {&p1, &p2}) {
layout.addWidget(p);
p->setFocusPolicy(Qt::StrongFocus);
}
// A button box
QDialogButtonBox box;
for (auto text : {"button3", "button4"})
box.addButton(text, QDialogButtonBox::NoRole)->setFocusPolicy(Qt::StrongFocus);
layout.addWidget(&box);
w.show();
return app.exec();
}
【讨论】:
我在 KDE/Ubuntu 上试用过。它会自动运行。
#include <QApplication>
#include "mainwindow.hpp"
int main(int argc, char** args) {
QApplication app(argc, args);
MainWindow m;
m.show();
return app.exec();
}
#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP
#include <QMainWindow>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow();
};
#endif // MAINWINDOW_HPP
#include "mainwindow.hpp"
#include <QPushButton>
#include <QVBoxLayout>
MainWindow::MainWindow() : QMainWindow() {
auto* w = new QWidget;
auto* l = new QVBoxLayout;
auto* p1 = new QPushButton("ok");
auto* p2 = new QPushButton("exit");
l->addWidget(p1);
l->addWidget(p2);
w->setLayout(l);
setCentralWidget(w);
}
TEMPLATE = app
TARGET = a
INCLUDEPATH += .
QT += widgets
HEADERS += mainwindow.hpp
SOURCES += main.cpp mainwindow.cpp
QMAKE_CXXFLAGS += -std=c++14
编辑:显然按钮切换焦点,但按 Enter 没有任何作用。我猜你必须使用与焦点相关的机制(在QWidget documentation 中搜索“焦点”)并自己实现它。或者查看QDialog(在我的示例中作为 QMainWindow 的替代品)。它应该对 enter 和 escape 按钮有一些有意义的默认行为。
旁注:也许您更愿意将QDialogButtonBox 用于项目中的确定和退出按钮。这是显示 OK/Cancel/Accept/Reject/... 按钮的跨平台方式,因为它们的排列因平台而异。而这门课可以帮助你。
【讨论】:
QWidget 或QDialog 作为顶级小部件而不是QMainWindow,您的代码会更简单。 QMainWindow 将在您需要其停靠窗口功能时使用。否则,它的使用是错误的,直接归咎于与 Qt Creator 捆绑的 Qt Widget Application 模板。如果您希望为简洁的示例提供一个简单的模板,I've got one for you :) 对于对话框,请使用 QDialog 基础。对于没有停靠区域的 MDI 区域,请直接使用 QMDIArea。
这比所有代码都容易。只需在两个按钮上使用 setFocusPolicy 和 Tabfocus,如下所示:
yourButtonOk->setFocusPolicy(Qt::TabFocus);
yourButtonExit->setFocusPolicy(Qt::TabFocus);
【讨论】:
hasFocus() 属性,所以你应该检查它是否有焦点:)。您也有两种方法:focusInEvent() 和 focusOutEvent(),您可能会感兴趣