PyQt5:如何将QPushButton连接到插槽?

Ian*_*aum 10 python qt signals-slots pyqt5

好的,几乎所有教程/可理解的人文语言文档都是针对PyQt4的.但是,PyQt5改变了整个"连接按钮到插槽"的工作方式,我仍然无法弄清楚如何做到这一点.

我在QtDesigner中做了一个快速的gui,我有一个QPushButton和一个标签.当我单击按钮时,我希望标签上的文本发生变化.在QtDesigner的C++中,很容易将两者连接起来.但我必须在python中编写所有内容.

我将带有pyuic5的.ui文件转换为.py文件.在Ui_MainWindow类中,我可以看到setupUi方法,它初始化self.button如下

self.testButton = QtWidgets.QPushButton(self.centralWidget)
self.testButton.setObjectName("newGame")
Run Code Online (Sandbox Code Playgroud)

然后,在方法结束时,

QtCore.QMetaObject.connectSlotsByName(MainWindow)
Run Code Online (Sandbox Code Playgroud)

被称为,但是,说实话,我无法弄清楚它做了什么以及它与哪里连接.

在Main类中,继承自QMainWindow,我编写了一个以下方法

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

我无法弄清楚如何将按钮信号连接到该插槽.在pyqt4中,我可以通过执行button.clicked.connect(self.change_text)手动设置它,但正如我发现的那样,PyQt5已经过时并放弃了这样简单的设置.

拜托,有人可以帮助我吗?

ekh*_*oro 20

我不知道你在哪里认为"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_())
Run Code Online (Sandbox Code Playgroud)

至于其他方面:在你目前的知识状态下,我会说你可以放心地忽略connectSlotsByNamepyqtSlot.虽然它们有其用途(详见上述文档),但在95%的应用程序中很少有任何实际需要使用它们.

对于您的具体情况,语法很简单:

    self.testButton.clicked.connect(self.change_text)
    ...

def change_text(self):
    self.ui.testLabel.setText("Button Clicked!")
Run Code Online (Sandbox Code Playgroud)

  • >我不知道你在哪里认为"PyQt5改变了整个'连接按钮到插槽'的工作原理",但这完全是完全错误的.我从那里得到它:http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html看看段落:'旧式信号和插槽'."QObject.connect()没有在pyqt5中实现,"是的.此外,当我尝试运行它,我得运行这样的事情,我得到"AttributeError:QPushButton对象没有属性连接":( (6认同)