signal c++ qt qpushbutton

c++ - signal - qpushbutton pyqt



¿Cómo hacer que un QPushButton se pueda presionar para ingresar la clave? (4)

Quiero que mi portátil de aplicaciones sea amigable. Puedo QPushButton en todas partes, pero si selecciono un QPushButton no puedo presionarlo con Enter , solo que con espacio .
¿Cuál es el problema? ¿Cómo hacer que sea prestable para Enter ?


tl; dr

  1. En la vista de interfaz de usuario de Qt Creator, selecciona el botón que quieres que se pueda presionar para ingresar.
  2. En el lado derecho en el Editor de propiedades desplácese hacia abajo a la parte azul titulada QPushButton .
  3. Marque la casilla de verificación por default autoDefault o default .

La mayoría de los casos, la principal diferencia entre autoDefault y default es cómo se prestará el botón. Pero hay casos en los que puede causar cosas inesperadas, así que para obtener más información, lea más a continuación.

Revision completa

Visión de conjunto

Cada QPushButton tiene 3 propiedades que no son heredadas. A partir de esto, dos ( default y autoDefault default ) tienen un papel principal cuando colocamos botones en QDialog , porque estas configuraciones (y el foco en uno de los botones) decide qué botón se presionará si presionamos Enter .
Todas estas propiedades se configuran como falsas por defecto. Solo la autoDefault es autoDefault que será verdadera si el botón tiene un padre QDialog .

Cada vez que presione el espacio, se presionará el botón con el foco sobre él. Los siguientes describirán qué sucede si presiona Enter .

Propiedad predeterminada

Si esto se establece como verdadero, el botón será un botón predeterminado .
Si se presiona Intro en el cuadro de diálogo, se presionará este botón, excepto cuando el foco esté en un botón autoDefault.

Solo debe haber un botón predeterminado. Si agrega más, el último agregado será el botón predeterminado.

Propiedad AutoDefault

Si esto se establece como verdadero, el botón será un botón autoDefault .
Si se presiona Intro en el diálogo, se presionará este botón si el foco está sobre él.

Si el foco no está en un botón autoDefault y no hay un botón predeterminado, se presionará el siguiente botón autoDefault para ingresar.

Propiedad plana

Si esto se establece como verdadero, el borde del botón no se levantará.

Tablas de ejemplo

Las siguientes tablas muestran qué botón se presionará con diferentes botones en diferentes enfoques. Los botones se agregan de izquierda a derecha.

Código de prueba

El siguiente código es una forma de agregar botones a un diálogo. Se puede usar para probar cambiando los valores boolean en setDefault() y / o setAutoDefault() .
Solo necesita crear una ventana, agregar un QPushButton llamado pushButton y una QLabel llamada QLabel (que es la denominación predeterminada). No olvide #include <QMessageBox> . Luego copie este código a la señal de clicked() del 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"); } }

Monitor

Si compila el código, puede obtener esta ventana. Ni siquiera tiene que hacer clic en los botones porque la forma en que los representa el sistema operativo muestra cuál se presionará si presiona Enter o espacio .

Documentación oficial

La mayor parte de esta respuesta se hizo de acuerdo con la documentación oficial.
La documentación de QPushButton hecha por Qt indica esto:

Los botones predeterminados y los predeterminados automáticamente deciden qué sucede cuando el usuario presiona ingresar en un cuadro de diálogo.

Un botón con esta propiedad establecida en verdadero (es decir, el botón predeterminado del diálogo) se presionará automáticamente cuando el usuario presione enter, con una excepción: si un botón autoDefault actualmente tiene foco, se presiona el botón autoDefault. Cuando el cuadro de diálogo tiene botones autoDefault pero no un botón predeterminado, al presionar Enter se presiona el botón autoDefault que actualmente tiene el foco, o si ningún botón tiene foco, el siguiente botón autoDefault en la cadena de enfoque.

En un diálogo, solo un botón a la vez puede ser el botón predeterminado. Este botón se muestra con un marco adicional (dependiendo del estilo de la GUI).

El comportamiento del botón predeterminado se proporciona solo en los cuadros de diálogo. Siempre se puede hacer clic en los botones desde el teclado presionando la barra espaciadora cuando el botón tiene foco.

Si la propiedad predeterminada está configurada como falsa en el botón predeterminado actual mientras el cuadro de diálogo está visible, se asignará automáticamente un nuevo valor la próxima vez que un botón en el cuadro de diálogo reciba el foco.

También vale la pena comprobar QDialog y QMessageBox .


De acuerdo con la documentación de Qt, Enter debería funcionar

Los botones de comando en los diálogos son por defecto los botones predeterminados automáticamente, es decir, se convierten en el botón predeterminado automáticamente cuando reciben el foco de entrada del teclado. Un botón predeterminado es un botón que se activa cuando el usuario presiona la tecla Intro o Retorno en un cuadro de diálogo. Puede cambiar esto con setAutoDefault ().

QPushButton


Establezca el orden de tabulación para sus widgets. Esto permitirá el uso de la tecla de retorno para hacer clic. Está allí por defecto dentro de Qt.


La respuesta de totymedli es genial. Agregué un pequeño programa para probar varias combinaciones de las funciones isDefault, autoDefault, setDefault y 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_())