【问题标题】:How to make a QPushButton pressable for enter key?如何使 QPushButton 可按下回车键?
【发布时间】:2012-08-06 22:41:32
【问题描述】:

我想让我的应用对笔记本电脑友好。我可以使用标签到任何地方,但是如果我使用标签到 QPushButton,我无法使用 Enter 按下它,只能使用 space
有什么问题?如何使其可按下 Enter

【问题讨论】:

    标签: c++ qt qpushbutton


    【解决方案1】:

    根据 Qt 的文档,Enter 应该可以工作

    对话框中的命令按钮默认是自动默认按钮,即当它们收到键盘输入焦点时,它们会自动成为默认按钮。默认按钮是当用户在对话框中按下 Enter 或 Return 键时激活的按钮。您可以使用 setAutoDefault() 更改此设置。

    http://qt-project.org/doc/qt-4.8/qpushbutton.html

    【讨论】:

    • 我有一个 Qt 应用程序有同样的问题,TabWidget 内的按钮工作正常,但它外面的按钮只能使用空格键“按下”
    • 在设计器中点击你想要按下的按钮,在屏幕右侧底部的绿色区域,有3个QPushButton属性。只需检查默认的。
    【解决方案2】:

    设置小部件的 Tab 键顺序。这将允许使用返回键进行点击。默认情况下它在 Qt 中。

    【讨论】:

      【解决方案3】:

      tl;博士

      1. 在 Qt Creator 的 UI 视图中,为 Enter 选择要使其可按下的按钮。
      2. 在属性编辑器的右侧向下滚动到标题为 QPushButton 的蓝色部分。
      3. 勾选autoDefaultdefault复选框。

      在大多数情况下,autoDefaultdefault 之间的主要区别在于按钮的呈现方式。但在某些情况下,它可能会导致意想不到的事情,因此有关更多信息,请阅读下文。


      全面审查

      概述

      每个QPushButton 都有 3 个未继承的属性。从这些中,当我们在QDialogs 上放置按钮时,两个(defaultautoDefault)起着主要作用,因为这些设置(以及对其中一个按钮的焦点)决定了如果我们点击 输入。
      默认情况下,所有这些属性都设置为 false。如果按钮有 QDialog 父级,则唯一的期望是 autoDefault

      每按一次空格,焦点所在的按钮就会被按下。下面将描述按下 Enter 会发生什么。

      默认属性

      如果设置为 true,则按钮将是 默认按钮
      如果在对话框上按下 Enter,则会按下此按钮,除非焦点位于自动默认按钮上。

      应该只有一个默认按钮。如果您添加更多,那么最后添加的将是默认按钮。

      自动默认属性

      如果设置为 true,则按钮将是 自动默认按钮
      如果在对话框上按下Enter,那么如果焦点在它上面,就会按下这个按钮。

      如果焦点不在自动默认按钮上并且没有默认按钮,则将为 Enter 按下下一个自动默认按钮。

      平面属性

      如果设置为 true,那么按钮的边框将不会被提升。

      示例表

      下表显示了在不同焦点上使用不同按钮将按下哪个按钮。按钮是从左到右添加的。

      测试代码

      以下代码是一种向对话框添加按钮的方法。它可用于通过更改setDefault() 和/或setAutoDefault() 处的boolean 值进行测试。
      您只需要创建一个窗口,添加一个名为pushButtonQPushButton 和一个名为labelQLabel(这是默认命名)。不要忘记#include <QMessageBox>。然后将此代码复制到按钮的clicked() 信号中:

      void MainWindow::on_pushButton_clicked()
      {
         QMessageBox msgBox;
      
         QPushButton button("Button");
         button.setDefault(false);
         button.setAutoDefault(false);
         msgBox.addButton(&button, QMessageBox::ActionRole);
      
         QPushButton autodefaultbutton("AutoDefault Button");
         autodefaultbutton.setDefault(false);
         autodefaultbutton.setAutoDefault(true);
         msgBox.addButton(&autodefaultbutton, QMessageBox::ActionRole);
      
         QPushButton autodefaultbutton2("AutoDefault Button2");
         autodefaultbutton2.setDefault(false);
         autodefaultbutton2.setAutoDefault(true);
         msgBox.addButton(&autodefaultbutton2, QMessageBox::ActionRole);
      
         QPushButton defaultbutton("Default Button");
         defaultbutton.setDefault(true);
         defaultbutton.setAutoDefault(false);
         msgBox.addButton(&defaultbutton, QMessageBox::ActionRole);
      
         msgBox.exec();
      
         if (msgBox.clickedButton() == &button) {
            ui->label->setText("Button");
         } else if (msgBox.clickedButton() == &defaultbutton) {
            ui->label->setText("Default Button");
         } else if (msgBox.clickedButton() == &autodefaultbutton) {
            ui->label->setText("AutoDefault Button");
         } else if (msgBox.clickedButton() == &autodefaultbutton2) {
            ui->label->setText("AutoDefault Button2");
         }
      }
      

      显示

      如果你编译代码你可以得到这个窗口。您甚至不必单击按钮,因为操作系统呈现它们的方式显示了如果您按 Enterspace 将按下哪个按钮。

      官方文档

      这个答案大部分是根据官方文档做出的。
      Qt 制作的QPushButton documentation 声明如下:

      默认和自动默认按钮决定当用户 在对话框中按 Enter。

      此属性设置为 true 的按钮(即对话框的默认设置) 按钮,)将在用户按下回车时自动按下, 有一个例外:如果自动默认按钮当前具有焦点,则 按下自动默认按钮。当对话框具有自动默认按钮时 但没有默认按钮,按 enter 将按 当前具有焦点的自动默认按钮,或者如果没有按钮具有 焦点,焦点链中的下一个自动默认按钮。

      在对话框中,一次只能有一个按钮作为默认按钮。 然后,此按钮会显示一个附加框架(取决于 GUI 风格)。

      默认按钮行为仅在对话框中提供。按钮可以 总是通过按空格键从键盘单击 按钮有焦点。

      如果当前默认按钮的默认属性设置为 false 当对话框可见时,将自动设置一个新的默认值 下次对话框中的按钮获得焦点时分配。

      QDialogQMessageBox 也值得一看。

      【讨论】:

        【解决方案4】:

        totymedli 的回答很棒。我添加了一个小程序来测试 isDefault、autoDefault、setDefault 和 setAutoDefault 函数的各种组合。

        import sys
        from PyQt4.QtGui import *
        from PyQt4.QtCore import *
        
        class Window(QDialog):
            def __init__(self, parent=None):
                super(Window, self).__init__(parent)
        
                autoDefaultInitialState = True
                defaultInitialState = False
        
                self.lineEdit1 = QLineEdit(self)
                self.lineEdit2 = QLineEdit(self)
                self.lineEdit3 = QLineEdit(self)
        
                # if we create a new button (e.g. "Print state"), with the same function,
                # it doesn't work, because adding a new button (apart from our 3 buttons)
                # produces total mess, so we use this lineedit for this purpose
                self.lineEdit1.returnPressed.connect(self.printState)
        
                #------------------------------------
        
                self.chkAutoDefaultOk = QCheckBox('OK setAutoDefault', self)
                self.chkAutoDefaultCancel = QCheckBox('Cancel setAutoDefault', self)
                self.chkAutoDefaultApply = QCheckBox('Apply setAutoDefault', self)
        
                self.chkDefaultOk = QCheckBox('OK setDefault', self)
                self.chkDefaultCancel = QCheckBox('Cancel setDefault', self)
                self.chkDefaultApply = QCheckBox('Apply setDefault', self)
        
                self.chkAutoDefaultOk.setChecked(autoDefaultInitialState)
                self.chkAutoDefaultCancel.setChecked(autoDefaultInitialState)
                self.chkAutoDefaultApply.setChecked(autoDefaultInitialState)
        
                self.chkDefaultOk.setChecked(defaultInitialState)
                self.chkDefaultCancel.setChecked(defaultInitialState)
                self.chkDefaultApply.setChecked(defaultInitialState)
        
                #------------------------------------
        
                self.pushButtonOk = QPushButton(self)
                self.pushButtonOk.setText("Ok")
                self.pushButtonOk.clicked.connect(lambda : print('ok'))
        
                self.pushButtonCancel = QPushButton(self)
                self.pushButtonCancel.setText("Cancel")
                self.pushButtonCancel.clicked.connect(lambda : print('cancel'))
        
                self.pushButtonApply = QPushButton(self)
                self.pushButtonApply.setText("Apply")
                self.pushButtonApply.clicked.connect(lambda : print('apply'))
        
                #------------------------------------
        
                self.pushButtonOk.setAutoDefault(autoDefaultInitialState)
                self.pushButtonCancel.setAutoDefault(autoDefaultInitialState)
                self.pushButtonApply.setAutoDefault(autoDefaultInitialState)
        
                self.pushButtonOk.setDefault(defaultInitialState)
                self.pushButtonCancel.setDefault(defaultInitialState)
                self.pushButtonApply.setDefault(defaultInitialState)
        
                #------------------------------------
        
                self.chkAutoDefaultOk.stateChanged.connect(self.chkChangeState)
                self.chkAutoDefaultCancel.stateChanged.connect(self.chkChangeState)
                self.chkAutoDefaultApply.stateChanged.connect(self.chkChangeState)
        
                self.chkDefaultOk.stateChanged.connect(self.chkChangeState)
                self.chkDefaultCancel.stateChanged.connect(self.chkChangeState)
                self.chkDefaultApply.stateChanged.connect(self.chkChangeState)
        
                #------------------------------------
        
                self.layout = QGridLayout(self)
                self.layout.addWidget(self.lineEdit1, 0, 0, 1, 3)
                self.layout.addWidget(self.lineEdit2, 1, 0, 1, 3)
                self.layout.addWidget(self.lineEdit3, 2, 0, 1, 3)
        
                self.layout.addWidget(self.chkAutoDefaultOk, 3, 0)
                self.layout.addWidget(self.chkAutoDefaultCancel, 3, 1)
                self.layout.addWidget(self.chkAutoDefaultApply, 3, 2)
        
                self.layout.addWidget(self.chkDefaultOk, 4, 0)
                self.layout.addWidget(self.chkDefaultCancel, 4, 1)
                self.layout.addWidget(self.chkDefaultApply, 4, 2)
        
                self.layout.addWidget(self.pushButtonOk, 5, 0)
                self.layout.addWidget(self.pushButtonCancel, 5, 1)
                self.layout.addWidget(self.pushButtonApply, 5, 2)
        
            def chkChangeState(self):
                obj = self.sender()
                if (obj == self.chkAutoDefaultOk):
                    self.pushButtonOk.setAutoDefault(self.chkAutoDefaultOk.isChecked())
                elif (obj == self.chkAutoDefaultCancel):
                    self.pushButtonCancel.setAutoDefault(self.chkAutoDefaultCancel.isChecked())
                elif (obj == self.chkAutoDefaultApply):
                    self.pushButtonApply.setAutoDefault(self.chkAutoDefaultApply.isChecked())
                elif (obj == self.chkDefaultOk):
                    self.pushButtonOk.setDefault(self.chkDefaultOk.isChecked())
                elif (obj == self.chkDefaultCancel):
                    self.pushButtonCancel.setDefault(self.chkDefaultCancel.isChecked())
                elif (obj == self.chkDefaultApply):
                    #print('sender: self.chkDefaultApply')
                    #print('before: ', self.pushButtonApply.isDefault())
                    self.pushButtonApply.setDefault(self.chkDefaultApply.isChecked())
                    #print('after: ', self.pushButtonApply.isDefault())
        
            def printState(self):
                print(self.pushButtonOk.autoDefault(), self.pushButtonCancel.autoDefault(), self.pushButtonApply.autoDefault())
                print(self.pushButtonOk.isDefault(), self.pushButtonCancel.isDefault(), self.pushButtonApply.isDefault())
                print('-' * 50)
        
        app = QApplication(sys.argv)
        main = Window()
        main.show()
        sys.exit(app.exec_())
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-22
          • 2014-06-08
          • 1970-01-01
          • 2010-11-13
          • 2017-07-07
          • 2014-08-31
          相关资源
          最近更新 更多