PythonQt设计器自定义插槽不工作,因为pyuic将插槽父名称定义为变量名而不是类名

PythonQt设计器自定义插槽不工作,因为pyuic将插槽父名称定义为变量名而不是类名,python,qt,pyqt,qt-designer,Python,Qt,Pyqt,Qt Designer,所以我试着设置一个简单的按钮小部件->主窗口(地面符号)信号->插槽。完成此操作后,我将在自定义插槽名称中进行编辑,稍后将其添加到类中 基本示例: 连接按钮.clicked()->MyMainWindow.my_插槽() 我试着查看compiler.py文件和其他相关文件,看看是否可以修改setupUi的参数名,但我在所有对导入函数的调用中迷失了方向,在文件之间来回跳跃。我只是把东西弄坏了。感谢上帝提供了备份。您犯了一个非常常见的错误,即试图编辑pyuic生成的gui模块。请阅读pyqt文档,以

所以我试着设置一个简单的按钮小部件->主窗口(地面符号)信号->插槽。完成此操作后,我将在自定义插槽名称中进行编辑,稍后将其添加到类中

基本示例:

连接按钮.clicked()->MyMainWindow.my_插槽()


我试着查看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_())