38

我想让我的应用程序对笔记本电脑友好。我可以在任何地方使用标签,但是如果我在QPushButton上进行标签,我不能用 按下它Enter,只能用space.
有什么问题?如何使其可压Enter

4

4 回答 4

81

tl;博士

  1. 在 Qt Creator 的 UI 视图中,选择要使其可按下的按钮Enter
  2. 在 Property Editor 的右侧向下滚动到标题为 的蓝色部分QPushButton
  3. autoDefault通过或选中复选框default

属性编辑器

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


全面审查

概述

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

每次按下space按钮时,焦点都会被按下。下面将描述如果按 会发生什么Enter

默认属性

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

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

自动默认属性

如果设置为 true,则该按钮将是一个autoDefault button
如果Enter在对话框上按下 ,则如果焦点在其上,则将按下此按钮。

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

平房

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

示例表

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

常规、自动默认和默认按钮

常规和自动默认按钮

测试代码

以下代码是一种向对话框添加按钮的方法。它可用于通过更改和/或的boolean值进行测试。 您只需要创建一个窗口,添加一个被调用和一个被调用(即默认命名)。别忘了。然后将此代码复制到按钮的信号中:setDefault()setAutoDefault()
QPushButtonpushButtonQLabellabel#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");
   }
}

展示

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

操作系统呈现的按钮

官方文档

这个答案大部分是根据官方文档做出的。Qt 制作
QPushButton 文档说明了这些:

默认和自动默认按钮决定当用户在对话框中按下回车时会发生什么。

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

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

默认按钮行为仅在对话框中提供。当按钮具有焦点时,始终可以通过按空格键从键盘单击按钮。

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

检查QDialogQMessageBox也是值得的。

于 2013-05-31T06:49:56.110 回答
3

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

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

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

于 2012-08-09T16:43:54.560 回答
2

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_())
于 2015-04-30T10:25:00.410 回答
-3

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

于 2012-08-10T05:21:20.817 回答