PyQt5:如何将QPushButton连接到槽?

13

好的,几乎所有易于理解的教程/用人类语言编写的文档都是针对PyQt4的。但是,PyQt5改变了整个“连接按钮到插槽”的工作方式,我仍然不知道如何做到这一点。

我在QtDesigner中快速创建了一个GUI,并且有一个QPushButton和一个标签。当我单击按钮时,我想要更改标签上的文本。在C++中,在QtDesigner中连接两者很容易。但是我必须使用Python编写所有内容。

我使用pyuic5将.ui文件转换为.py文件。在那里,在Ui_MainWindow类中,我可以看到setupUi方法,它将self.button初始化如下:

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中,我可以通过button.clicked.connect(self.change_text)手动设置它,但是我发现,PyQt5已经弃用和丢弃了这样简单的设置。

请问,有谁能帮我解决这个问题吗?

1个回答

25

我不知道你是从哪里得到的“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_())

至于其他几点: 就你目前的知识水平而言,我认为你可以安全地忽略connectSlotsByNamepyqtSlot。虽然它们有其用处(详见上述文档),但在95%的应用程序中很少真正需要使用它们。

对于你的特定情况,语法很简单:

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

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

6
我不知道你从哪里得到了“PyQt5改变了整个‘将按钮连接到槽’的工作方式”的想法,但这是完全错误的。你所提到的网站中的段落"Old-style signals and slots"提到"QObject.connect()在PyQt5中未被实现",但这并不意味着整个连接过程被改变了。同时,当我尝试运行它时,我遇到了这样的问题:“AttributeError: QPushButton对象没有connect属性”。 - JJS
等等!我发现我做错了什么!我用那个之前提到的链接(pyqt4_differences)来建议自己,而且Eclipse没有在代码建议中显示“clicked”,这让我认为没有办法做到!我的错,一直都是我的错,谢谢回复,我错了 :( - JJS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接