【问题标题】:How to use TAB Key to focus one of two qpushbutton如何使用 TAB 键聚焦两个 qpushbutton 之一
【发布时间】:2015-09-03 12:06:49
【问题描述】:

在一个小部件中,我放置了两个 QPushButton(比如说“OK”在左边,“EXIT”在右边)。 当我使用鼠标按下它们时,它们会定期工作。 假设我想使用 TAB 键从一个切换到另一个:可能吗? 以及如何做到这一点?

【问题讨论】:

  • 它不会自动工作吗?
  • @Lol4t0 取决于平台。

标签: qt qpushbutton


【解决方案1】:

在某些平台上,按钮之间的键盘焦点导航是默认行为,但在某些平台上不是。

如果您希望在所有平台上使用键盘导航,则应为按钮设置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();
}

【讨论】:

    【解决方案2】:

    我在 KDE/Ubuntu 上试用过。它会自动运行。

    main.cpp

    #include <QApplication>
    #include "mainwindow.hpp"
    
    int main(int argc, char** args) {
        QApplication app(argc, args);
    
        MainWindow m;
        m.show();
    
        return app.exec();
    }
    

    主窗口.hpp

    #ifndef MAINWINDOW_HPP
    #define MAINWINDOW_HPP
    
    #include <QMainWindow>
    
    class MainWindow : public QMainWindow {
        Q_OBJECT
    public:
        MainWindow();
    };
    
    #endif // MAINWINDOW_HPP
    

    主窗口.cpp

    #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);
    }
    

    a.pro

    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/... 按钮的跨平台方式,因为它们的排列因平台而异。而这门课可以帮助你。

    【讨论】:

    • 如果您使用QWidgetQDialog 作为顶级小部件而不是QMainWindow,您的代码会更简单。 QMainWindow 将在您需要其停靠窗口功能时使用。否则,它的使用是错误的,直接归咎于与 Qt Creator 捆绑的 Qt Widget Application 模板。如果您希望为简洁的示例提供一个简单的模板,I've got one for you :) 对于对话框,请使用 QDialog 基础。对于没有停靠区域的 MDI 区域,请直接使用 QMDIArea
    【解决方案3】:

    这比所有代码都容易。只需在两个按钮上使用 setFocusPolicy 和 Tabfocus,如下所示:

     yourButtonOk->setFocusPolicy(Qt::TabFocus);
     yourButtonExit->setFocusPolicy(Qt::TabFocus);
    

    【讨论】:

    • 正是我想要的。现在,下一步是:如何理解哪个按钮被聚焦,所以当我按下“enter”键时,下一个动作对应于选定的按钮?是否有一些“布尔”属性可以检测到这一点?
    • @LittleSaints 是的,QPushButton 类有一个hasFocus() 属性,所以你应该检查它是否有焦点:)。您也有两种方法:focusInEvent()focusOutEvent(),您可能会感兴趣
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多