PyQt5: Как подключить QPushButton к слоту?
хорошо, так что почти каждый учебник/понятный-письменный-на-человеческом-языке-документация для PyQt4. Но PyQt5 изменил, как работает вся кнопка подключения к слоту, и я до сих пор не могу понять, как это сделать.
Я сделал быстрый gui в QtDesigner, и у меня есть QPushButton и ярлык. Когда я нажимаю кнопку, Я хочу, чтобы текст на этикетке изменился. в C++ в QtDesigner их легко подключить. Но я должен написать все это на python.
I конвертировать.ui файл с pyuic5 к. файл py. Там, в классе Ui_MainWindow, я вижу метод setupUi, который инициализирует self.кнопка следующим образом
self.testButton = QtWidgets.QPushButton(self.centralWidget)
self.testButton.setObjectName("newGame")
затем, в конце метода,
QtCore.QMetaObject.connectSlotsByName(MainWindow)
называется, но, честно говоря, я не могу понять, что он делает и с чем он связан.
В основном классе, наследуя от QMainWindow, я пишу следующий метод
@pyqtSlot(name='change')
def change_text(self):
self.ui.testLabel.setText("Button Clicked!")
и я не могу понять, как подключить сигнал кнопки к этому шлиц. В pyqt4 я мог бы настроить его вручную, выполнив кнопку.нажатый.подключение (self.change_text), но, как я узнал, PyQt5 устарел и отбросил такую простую настройку.
пожалуйста, кто-нибудь может мне помочь с этим?
1 ответов
Я не знаю, откуда у вас возникла идея, что "PyQt5 изменил, как работает вся кнопка подключения к слоту", но это совершенно и совершенно неправильно. Таких изменений не было, что легко видно из официальной документации PyQt:
но даже без чтения какой-либо документации, это достаточно легко проверить себе. Например, в следующем скрипте просто переключите комментарии на первые две строки, и он будет работать точно так же:
# 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_())
что касается других моментов: при вашем текущем состоянии знаний, я бы сказал, Вы можете смело игнорировать connectSlotsByName
и pyqtSlot
. Хотя они имеют свое использование (см. выше документы для деталей), очень редко есть реальная необходимость использовать их в 95% приложений.
для вашего конкретного случая, синтаксис-это просто:
self.testButton.clicked.connect(self.change_text)
...
def change_text(self):
self.ui.testLabel.setText("Button Clicked!")