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
- En la vista de interfaz de usuario de Qt Creator, selecciona el botón que quieres que se pueda presionar para ingresar.
- En el lado derecho en el Editor de propiedades desplácese hacia abajo a la parte azul titulada
QPushButton
. - Marque la casilla de verificación por
default
autoDefault
odefault
.
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 ().
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_())