好的,几乎所有教程/可理解的人类语言文档都是针对PyQt4的。但是,PyQt5改变了整个“连接按钮到插槽”的工作方式,我仍然无法弄清楚如何做到这一点。
我在QtDesigner中做了一个快速的gui,我有一个QPushButton和一个标签。当我单击按钮时,我希望标签上的文本发生变化。在QtDesigner的C ++中,很容易将两者连接起来。但我必须在python中编写所有内容。
我将.ui文件与pyuic5转换为.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已经过时并放弃了这样简单的设置。
拜托,有人可以帮助我吗?
答案 0 :(得分:17)
我不知道你在哪里知道“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!")