Подтвердить что ты не робот

Как сделать QPushButton для ввода ключа?

Я хочу сделать свой ноутбук для ноутбука дружелюбным. Я могу использовать вкладку везде, но если я перейду к QPushButton, я не могу нажать ее с помощью Enter, только с space.
В чем проблема? Как сделать его нажатием для Enter?

4b9b3361

Ответ 1

TL;DR

  • В представлении пользовательского интерфейса Qt Creator выберите кнопку, которую вы хотите сделать нажатой для Enter.
  • В правой части редактора свойств прокрутите вниз до синей части под названием QPushButton.
  • Установите флажок autoDefault или default.

Property Editor

В большинстве случаев основным отличием между autoDefault и default является то, как будет отображаться кнопка. Но есть случаи, когда это может вызвать неожиданные вещи, поэтому для получения дополнительной информации см. Ниже.


Полный обзор

Обзор

Каждый QPushButton имеет 3 свойства, которые не наследуются. Из них две (default и autoDefault) играют важную роль, когда мы помещаем кнопки на QDialog s, потому что эти настройки (и фокусировка на одной из кнопок) определяют, какая кнопка будет нажата, если мы нажмем Enter.
По умолчанию все эти свойства установлены false. Только expection autoDefault, который будет истинным, если кнопка имеет родительский QDialog.

При каждом нажатии space будет нажата кнопка с фокусом на нем. Ниже описывается, что произойдет, если вы нажмете Enter.

Свойство по умолчанию

Если это значение установлено верно, кнопка будет кнопкой по умолчанию.
Если в диалоговом окне нажать Enter, эта кнопка будет нажата, за исключением случаев, когда фокус находится на кнопке autoDefault.

Должна быть только одна кнопка по умолчанию. Если вы добавите больше, то последняя добавленная будет кнопкой по умолчанию.

Свойство AutoDefault

Если это значение установлено true, кнопка будет кнопкой autoDefault.
Если в диалоговом окне нажать Enter, эта кнопка будет нажата, если фокус включен.

Если фокус не находится на кнопке autoDefault и кнопка по умолчанию отсутствует, то для кнопки Enter будет нажата следующая кнопка autoDefault.

Плоское свойство

Если это значение установлено true, граница кнопки не будет повышена.

Примеры таблиц

В следующих таблицах показано, какая кнопка будет нажата с различными кнопками на разных фокусах. Кнопки добавляются слева направо.

Regular, autoDefault and default buttons

Regular and autoDefault buttons

Тестовый код

Следующий код - это способ добавления кнопок в диалог. Его можно использовать для тестирования, изменив значения 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.

OS rendered buttons

Официальная документация

Большая часть этого ответа была сделана в соответствии с официальной документацией.
Документация QPushButton, сделанная Qt, гласит следующее:

Кнопки по умолчанию и autodefault определяют, что происходит, когда пользователь нажатие вводит в диалоговом окне.

Кнопка с этим свойством имеет значение true (т.е. диалоговое окно по умолчанию кнопка,) будет автоматически нажата, когда пользователь нажимает кнопку ввода, за одним исключением: если в настоящее время кнопка autoDefault имеет фокус, Нажата кнопка autoDefault. Когда в диалоговом окне есть кнопки autoDefault но кнопка по умолчанию не нажата, нажатие кнопка autoDefault, которая в настоящее время имеет фокус, или если ни одна кнопка не имеет focus, следующая кнопка autoDefault в цепочке фокусировки.

В диалоговом окне по умолчанию может использоваться только одна кнопка. Затем эта кнопка отображается с дополнительным кадром (в зависимости от стиль GUI).

Поведение кнопки по умолчанию предоставляется только в диалогах. Кнопки могут всегда щелкайте с клавиатуры, нажав клавишу "Пробел", когда кнопка имеет фокус.

Если для свойства по умолчанию установлено значение false на текущей кнопке по умолчанию в то время как диалог отображается, новое значение по умолчанию будет автоматически назначается в следующий раз, когда кнопка в диалоговом окне получает фокус.

Также стоит проверить QDialog и QMessageBox.

Ответ 2

В соответствии с документацией Qt Enter должен работать

Командные кнопки в диалогах по умолчанию являются кнопками автоматического по умолчанию, т.е. автоматически становятся кнопкой по умолчанию, когда они получают фокус ввода с клавиатуры. Кнопка по умолчанию - это кнопка, которая активируется, когда пользователь нажимает клавишу Enter или Return в диалоговом окне. Вы можете изменить это с помощью setAutoDefault().

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

Ответ 3

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_())

Ответ 4

Задайте порядок вкладок для ваших виджетов. Это позволит использовать ключ возврата для нажатия. Его там по умолчанию внутри Qt.