【问题标题】:PyQt5: How can I connect a QPushButton to a slot?PyQt5:如何将 QPushButton 连接到插槽?
【发布时间】:2013-11-26 18:41:33
【问题描述】:

好的,几乎每个教程/可理解的人类语言文档都是针对 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")

然后,在方法结束时,

QtCore.QMetaObject.connectSlotsByName(MainWindow)

被调用,但是,老实说,我不知道它做了什么以及它连接到哪里。

在Main类中,继承自QMainWindow,我写了如下方法

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

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

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

【问题讨论】:

    标签: python qt signals-slots pyqt5


    【解决方案1】:

    我不知道你从哪里得到“PyQt5 改变了整个‘连接按钮到插槽’的工作方式”的想法,但这是完全错误的。从 PyQt 官方文档中可以很容易地看出,没有这样的变化:

    但即使不阅读任何文档,也很容易自己进行测试。例如,在下面的脚本中,只需在前两行切换 cmets,它就会运行起来:

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

    【讨论】:

    • >我不知道你从哪里得到“PyQt5 改变了整个‘连接按钮到插槽’的工作方式”的想法,但这是完全错误的。我从那里得到它:pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html 看段落:'旧式信号和插槽'。 “QObject.connect() 未在 pyqt5 中实现”,是的。另外,当我尝试运行它时,我会运行这样的东西,我得到“AttributeError:QPushButton object has no attribute connect”:(
    • 等等!我发现我做错了什么!我建议自己使用上述链接(pyqt4_differences),而eclipse在代码建议中没有显示“点击”的事实,这让我相信没有办法做到这一点!我的坏,我的坏,谢谢你的回复,我错了:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多