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