PythonQt设计器自定义插槽不工作,因为pyuic将插槽父名称定义为变量名而不是类名
所以我试着设置一个简单的按钮小部件->主窗口(地面符号)信号->插槽。完成此操作后,我将在自定义插槽名称中进行编辑,稍后将其添加到类中 基本示例: 连接按钮.clicked()->MyMainWindow.my_插槽()PythonQt设计器自定义插槽不工作,因为pyuic将插槽父名称定义为变量名而不是类名,python,qt,pyqt,qt-designer,Python,Qt,Pyqt,Qt Designer,所以我试着设置一个简单的按钮小部件->主窗口(地面符号)信号->插槽。完成此操作后,我将在自定义插槽名称中进行编辑,稍后将其添加到类中 基本示例: 连接按钮.clicked()->MyMainWindow.my_插槽() 我试着查看compiler.py文件和其他相关文件,看看是否可以修改setupUi的参数名,但我在所有对导入函数的调用中迷失了方向,在文件之间来回跳跃。我只是把东西弄坏了。感谢上帝提供了备份。您犯了一个非常常见的错误,即试图编辑pyuic生成的gui模块。请阅读pyqt文档,以
我试着查看compiler.py文件和其他相关文件,看看是否可以修改setupUi的参数名,但我在所有对导入函数的调用中迷失了方向,在文件之间来回跳跃。我只是把东西弄坏了。感谢上帝提供了备份。您犯了一个非常常见的错误,即试图编辑pyuic生成的gui模块。请阅读pyqt文档,以便您了解如何正确使用pyuic。但我不想!我在Qt Designer中创建的插槽名称未被正确引用,因为该插槽希望看到名为“MyMainWindow”的父窗口小部件,但因为它是主窗口,pyuic将其重命名为Ui_MyMainWindow,使该插槽不起作用。在我研究此问题时,如果我想编写自己的插槽,我必须创建Ui_MyMainWindow的子类,然后手动在子类中写入连接?如果我必须这样做,那很好,但是如果有如下建议(我尝试过的),那就没有意义了:你不需要“手工”建立连接,因为它们已经在pyuic生成的模块中建立了。您所需要做的就是确保传递到
setupUi
的对象有一个具有正确名称的插槽。如果您查看我上面发布的链接中的第二个和第三个示例,应该很容易看到您只需要添加一个名为my_slot
的方法,一切都将按预期工作。(显然,您应该忽略这些示例中的信号连接,因为它们与您的用例无关)。您犯了一个非常常见的错误,即试图编辑pyuic生成的gui模块。请阅读pyqt文档,以便您了解如何正确使用pyuic。但我不想!我在Qt Designer中创建的插槽名称未被正确引用,因为该插槽希望看到名为“MyMainWindow”的父窗口小部件,但因为它是主窗口,pyuic将其重命名为Ui_MyMainWindow,使该插槽不起作用。在我研究此问题时,如果我想编写自己的插槽,我必须创建Ui_MyMainWindow的子类,然后手动在子类中写入连接?如果我必须这样做,那很好,但是如果有如下建议(我尝试过的),那就没有意义了:你不需要“手工”建立连接,因为它们已经在pyuic生成的模块中建立了。您所需要做的就是确保传递到setupUi
的对象有一个具有正确名称的插槽。如果您查看我上面发布的链接中的第二个和第三个示例,应该很容易看到您只需要添加一个名为my_slot
的方法,一切都将按预期工作。(显然,您应该忽略这些示例中的信号连接,因为它们与您的用例无关)。
class Ui_MyMainWindow(object):
def setupUi(self, MyMainWindow):
MyMainWindow.setObjectName(_fromUtf8("MyMainWindow"))
MyMainWindow.setEnabled(True)
MyMainWindow.resize(537, 349)
...
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.horizontalLayout.addWidget(self.pushButton)
MyMainWindow.setCentralWidget(self.centralwidget)
'''PROBLEM MyMainWindow.my_slot() in the following line should be
Ui_MyMainWindow.my_slot so slot/function belongs to the class
or even without a parent so I can do a ''from my_existing_module import *''.
For widget->widget calls, this way of linking makes sense, but
if I just want to call some pre-written function, it doesnt
work without stupid hand editing'''
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), MyMainWindow.my_slot)
QtCore.QMetaObject.connectSlotsByName(MyMainWindow)
...
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MyMainWindow = QtGui.QMainWindow()
ui = Ui_MyMainWindow()
ui.setupUi(MyMainWindow)
MyMainWindow.show()
sys.exit(app.exec_())