我想让我的应用程序对笔记本电脑友好。我可以按 Tab 键到任何地方,但如果我按 Tab 键到 QPushButton,我无法使用 Enter 按下它,只能使用 space。
有什么问题吗?如何使其可按下Enter?
QPushButton
的蓝色部分。autoDefault
或 default
选中复选框。大多数情况下,
autoDefault
和 default
之间的主要区别在于按钮的呈现方式。但在某些情况下,它可能会导致意想不到的事情,因此有关更多信息,请阅读下面的更多内容。
每个
QPushButton
有 3 个不可继承的属性。其中,当我们将按钮放在 default
上时,两个(autoDefault
和 QDialog
)发挥着重要作用,因为这些设置(以及对其中一个按钮的焦点)决定了如果我们点击 将按下哪个按钮输入。autoDefault
如果按钮有 QDialog
父级,则为 true。
每次按空格时,焦点所在的按钮都会被按下。下面将描述按 Enter 会发生什么。
如果设置为 true,该按钮将是 默认按钮。
如果在对话框上按 Enter,则将按下此按钮,除非焦点位于 autoDefault 按钮上。
应该只有一个默认按钮。如果您添加更多按钮,则最后添加的按钮将成为默认按钮。
如果设置为 true,该按钮将是 autoDefault 按钮。
如果在对话框上按 Enter,则当焦点位于该按钮上时,将按下此按钮。
如果焦点不在 autoDefault 按钮上并且没有默认按钮,则将按下下一个 autoDefault 按钮以进行 Enter。
如果设置为true,则按钮的边框将不会凸起。
下表显示了不同焦点上的不同按钮将按下哪个按钮。按钮从左到右添加。
以下代码是向对话框添加按钮的方法。它可用于通过更改
boolean
和/或 setDefault()
处的 setAutoDefault()
值进行测试。QPushButton
的 pushButton
和一个名为 QLabel
的 label
(这是默认命名)。别忘了#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 文档 说明了这些:
默认和自动默认按钮决定当用户 在对话框中按 Enter 键。
此属性设置为 true 的按钮(即对话框的默认值 按钮,)将在用户按下回车键时自动按下, 但有一个例外:如果 autoDefault 按钮当前具有焦点,则 自动默认按钮被按下。当对话框具有 autoDefault 按钮时 但没有默认按钮,按 Enter 键将按 当前具有焦点的 autoDefault 按钮,或者如果没有按钮具有焦点 焦点,焦点链中的下一个自动默认按钮。
在对话框中,一次只能有一个按钮作为默认按钮。 然后,该按钮会显示一个附加框架(取决于 GUI 风格)。
默认按钮行为仅在对话框中提供。按钮可以 始终通过按空格键从键盘上单击 按钮获得焦点。
如果当前默认按钮上的默认属性设置为 false 当对话框可见时,将自动显示新的默认值 下次对话框中的按钮获得焦点时分配。
还值得检查 QDialog 和 QMessageBox。
根据 Qt 的文档 Enter 应该可以工作
对话框中的命令按钮默认为自动默认按钮,即当它们接收到键盘输入焦点时,它们会自动成为默认按钮。默认按钮是当用户在对话框中按 Enter 或 Return 键时激活的按钮。您可以使用 setAutoDefault() 更改此设置。
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_())
设置小部件的 Tab 键顺序。这将允许使用返回键进行单击。默认情况下它位于 Qt 内部。