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!")