Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt5:如何将QPushButton连接到插槽?_Python_Qt_Signals Slots_Pyqt5 - Fatal编程技术网

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

Python PyQt5:如何将QPushButton连接到插槽?,python,qt,signals-slots,pyqt5,Python,Qt,Signals Slots,Pyqt5,好的,几乎所有用人类语言编写的教程/易懂文档都是针对PyQt4的。但是,PyQt5改变了整个“连接按钮到插槽”的工作方式,我仍然不知道该怎么做 我在QtDesigner中做了一个快速gui,我有一个QPushButton和一个标签。单击按钮时,我希望标签上的文本发生更改。在QtDesigner中的C++中,很容易将两者连接起来。但是我必须用python来写 我使用pyuic5将.ui文件转换为.py文件。在Ui_MainWindow类中,我可以看到setupUi方法,它初始化self.butto

好的,几乎所有用人类语言编写的教程/易懂文档都是针对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)
被称为,但是,老实说,我不知道它是做什么的,它在哪里连接

在从QMainWindow继承的Main类中,我编写了以下方法

@pyqtSlot(name='change')
def change_text(self):
    self.ui.testLabel.setText("Button Clicked!")
我不知道如何把按钮信号连接到那个插槽。在pyqt4中,我可以通过执行button.clicked.connect(self.change_text)手动设置它,但正如我所发现的,PyQt5已经过时并放弃了这种简单的设置


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

我不知道你是从哪里想到“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
pyqtlot
。尽管它们有自己的用途(详见上述文档),但在95%的应用程序中很少真正需要使用它们

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

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

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

>我不知道你是从哪里想到“PyQt5改变了整个“连接按钮到插槽”的工作方式”,但这是完全错误的。我从那里得到了答案:看一段:“老式信号和插槽”。“在pyqt5中没有实现QObject.connect()”,是的。另外,当我尝试运行它时,我会运行这样一个东西,我得到“AttributeError:QPushButton对象没有属性连接”:(等等!我已经发现我做错了什么!我是在用前面提到的链接建议自己的(pyqt4_),而且eclipse在代码建议中没有显示“clicked”,这让我相信没有办法做到这一点!我的错,我的错一直都是,谢谢你的回复,我错了:(