好吧,几乎所有教程/可理解的用人类语言编写的文档都是针对 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 的主类中,我编写了以下方法
@pyqtSlot(name='change')
def change_text(self):
self.ui.testLabel.setText("Button Clicked!")
我不知道如何将按钮信号连接到该插槽。在 pyqt4 中,我可以通过执行 button.clicked.connect(self.change_text) 手动设置它,但正如我发现的,PyQt5 废弃并放弃了这种简单的设置。
请问有人可以帮我解决这个问题吗?
我不知道你从哪里得到“PyQt5 改变了整个‘将按钮连接到插槽’的工作方式”的想法,但这是完全错误的。没有这样的变化,从 PyQt 官方文档中可以很容易地看出:
- PyQt4 信号和槽文档 http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html
- PyQt5 信号和槽文档 http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html
但即使不阅读任何文档,您也可以轻松进行测试。例如,在下面的脚本中,只需切换前两行的注释,它就会以同样的方式运行:
# 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
and pyqtSlot
。尽管它们有其用途(有关详细信息,请参阅上面的文档),但在 95% 的应用程序中很少真正需要使用它们。
对于您的具体情况,语法很简单:
self.testButton.clicked.connect(self.change_text)
...
def change_text(self):
self.ui.testLabel.setText("Button Clicked!")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)