PyQt5: ¿Cómo puedo conectar un QPushButton a una ranura?

Bien, casi todos los tutoriales / comprensibles-escritos en lenguaje humano son para PyQt4. Pero, PyQt5 cambió la forma en que funciona todo el ‘botón de conexión a una ranura’, y aún no puedo entender cómo hacerlo.

Hice una gui rápida en QtDesigner, y tengo un QPushButton y una etiqueta. Cuando hago clic en el botón, quiero que cambie el texto de la etiqueta. en C ++ en QtDesigner, es fácil conectar los dos. Pero tengo que escribirlo todo en python.

Convierto el archivo .ui con pyuic5 al archivo .py. Allí, en la clase Ui_MainWindow, puedo ver el método setupUi, que inicializa el botón self de la siguiente manera

self.testButton = QtWidgets.QPushButton(self.centralWidget) self.testButton.setObjectName("newGame") 

entonces, al final del método,

 QtCore.QMetaObject.connectSlotsByName(MainWindow) 

se llama, pero, para ser honesto, no puedo entender qué hace y a qué se conecta con dónde.

en la clase principal, heredando de QMainWindow, escribo un método siguiente

 @pyqtSlot(name='change') def change_text(self): self.ui.testLabel.setText("Button Clicked!") 

Y no puedo averiguar cómo conectar la señal del botón a esa ranura. En pyqt4, pude configurarlo manualmente haciendo button.clicked.connect (self.change_text), pero como he descubierto, PyQt5 ha quedado obsoleto y descartado en una configuración tan simple.

Por favor, ¿alguien puede ayudarme con eso?

No sé de dónde sacó la idea de que “PyQt5 cambió la forma en que funciona todo el ‘botón de conexión a una ranura'”, pero está completamente equivocado. No ha habido tales cambios, como se puede ver fácilmente en la documentación oficial de PyQt:

  • Documentación PyQt4 Signals & Slots
  • Documentación PyQt5 Signals & Slots

Pero incluso sin leer ninguna documentación, es bastante fácil probarlo por ti mismo. Por ejemplo, en el siguiente script, simplemente cambie los comentarios en las dos primeras líneas, y se ejecutará de la misma manera:

 # from PyQt5.QtWidgets import ( from PyQt4.QtGui import ( QApplication, QWidget, QVBoxLayout, QPushButton, QLabel, ) class Window(QWidget): def __init__(self): super(Window, self).__init__() self.button = QPushButton('Test', self) self.label = QLabel(self) self.button.clicked.connect(self.handleButton) layout = QVBoxLayout(self) layout.addWidget(self.label) layout.addWidget(self.button) def handleButton(self): self.label.setText('Button Clicked!') if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_()) 

En cuanto a los otros puntos: en su estado actual de conocimiento, yo diría que puede ignorar con seguridad connectSlotsByName y pyqtSlot . Aunque tienen sus usos (consulte la documentación anterior para obtener más detalles), casi nunca hay una necesidad real de usarlos en el 95% de las aplicaciones.

Para su caso específico, la syntax es simplemente:

  self.testButton.clicked.connect(self.change_text) ... def change_text(self): self.ui.testLabel.setText("Button Clicked!")