Как сделать, чтобы QPushButton нажимался на клавишу ввода?
Я хочу сделать свое приложение для ноутбука дружелюбным. Я могу вкладывать в любое место, но если я вкладываю в QPushButton, я не могу нажать его с помощью Enter, только с пробелом.
В чем проблема? Как сделать так, чтобы он нажимался на Enter?
4 ответа
ТЛ; др
- В представлении пользовательского интерфейса Qt Creator выберите кнопку, которую вы хотите сделать нажатой для Enter.
- В правой части в редакторе свойств прокрутите вниз до синей части под названием
QPushButton
, - Установите флажок
autoDefault
или жеdefault
,
В большинстве случаев основные различия между autoDefault
а также default
как кнопка будет отображаться. Но есть случаи, когда это может вызвать неожиданные вещи, поэтому для получения дополнительной информации читайте ниже.
Полный обзор
обзор
каждый QPushButton
имеет 3 свойства, которые не наследуются. Из этих двух (default
а также autoDefault
) играют главную роль, когда мы размещаем кнопки на QDialog
s, потому что эти настройки (и фокус на одной из кнопок) решают, какая кнопка будет нажата, если мы нажмем Enter.
Все эти свойства по умолчанию имеют значение false. Только ожидание autoDefault
это будет верно, если кнопка имеет QDialog
Родитель.
Каждый раз, когда вы нажимаете пробел, будет нажата кнопка с фокусировкой на ней. Ниже описано, что произойдет, если вы нажмете Enter.
Свойство по умолчанию
Если установлено значение true, кнопка будет кнопкой по умолчанию.
Если в диалоговом окне нажать Enter, то эта кнопка будет нажата, кроме случаев, когда фокус находится на кнопке автозамены.
Должна быть только одна кнопка по умолчанию. Если вы добавите больше, то последним добавленным будет кнопка по умолчанию.
Свойство AutoDefault
Если для этого параметра установлено значение true, кнопка будет кнопкой автоматического выбора по умолчанию.
Если в диалоговом окне нажать Enter, то эта кнопка будет нажата, если на нем находится фокус.
Если фокус находится не на кнопке autoDefault, и кнопка по умолчанию отсутствует, то для ввода будет нажата следующая кнопка autoDefault.
Квартира собственность
Если установлено значение 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 или пробел.
Официальная документация
Большая часть этого ответа была сделана согласно официальной документации.
Документация QPushButton, созданная Qt, гласит:
Кнопки "По умолчанию" и "Авто по умолчанию" определяют, что произойдет, когда пользователь нажимает кнопку ввода в диалоговом окне.
Кнопка с этим свойством, установленным на true (т. Е. Кнопка диалога по умолчанию), будет автоматически нажиматься, когда пользователь нажимает клавишу ввода, за одним исключением: если кнопка autoDefault в данный момент имеет фокус, нажата кнопка autoDefault. Если в диалоговом окне есть кнопки autoDefault, но нет кнопки по умолчанию, при нажатии клавиши ввода будет нажата кнопка autoDefault, которая в данный момент имеет фокус, или, если ни одна кнопка не имеет фокуса, следующая кнопка autoDefault в цепочке фокусировки.
В диалоговом окне только одна кнопка за раз может быть кнопкой по умолчанию. Эта кнопка затем отображается с дополнительным фреймом (в зависимости от стиля GUI).
Поведение кнопки по умолчанию предоставляется только в диалогах. Кнопки всегда можно нажимать с клавиатуры, нажимая клавишу пробела, когда кнопка имеет фокус.
Если для свойства по умолчанию установлено значение false на текущей кнопке по умолчанию, когда диалоговое окно является видимым, новое значение по умолчанию будет автоматически назначено при следующей фокусировке кнопки в диалоговом окне.
Также стоит проверить QDialog и QMessageBox.
Согласно документации Qt Enter должен работать
Командные кнопки в диалоговых окнах по умолчанию являются автоматическими кнопками по умолчанию, то есть они автоматически становятся кнопками по умолчанию, когда получают фокус ввода с клавиатуры. Кнопка по умолчанию - это кнопка, которая активируется, когда пользователь нажимает клавишу Enter или Return в диалоговом окне. Вы можете изменить это с помощью setAutoDefault ().
Тотимедли ответ велик. Я добавил небольшую программу для тестирования различных комбинаций функций 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_())
Установите порядок вкладок для ваших виджетов. Это позволит использовать клавишу возврата для нажатия. Его там по умолчанию внутри Qt.