Python AttributeError:“;“对话”;对象没有属性';setupUi';

Python AttributeError:“;“对话”;对象没有属性';setupUi';,python,class,qt-designer,qdialog,Python,Class,Qt Designer,Qdialog,我在pyqt5-qt设计器上制作了两个表单。一个是主窗体,第二个是对话框,我将使用它进行用户输入。我将两者都转换为py代码 首先,我应该通知您,我不会修改转换后的Ui.py文件。我更喜欢有一个额外的“主”文件,在其中设置每次修改。我这样做是为了在每次使用Ui文件进行修改时不必进行额外的更改 因此,我在主文件中添加了第二个类,并试图通过菜单项从主窗体类调用它。下面是一些示例代码: class MainForm(QMainWindow): def __init__(self, parent=

我在pyqt5-qt设计器上制作了两个表单。一个是主窗体,第二个是对话框,我将使用它进行用户输入。我将两者都转换为py代码

首先,我应该通知您,我不会修改转换后的Ui.py文件。我更喜欢有一个额外的“主”文件,在其中设置每次修改。我这样做是为了在每次使用Ui文件进行修改时不必进行额外的更改

因此,我在主文件中添加了第二个类,并试图通过菜单项从主窗体类调用它。下面是一些示例代码:

class MainForm(QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)
        self.ui = Ui_MainForm()
        self.ui.setupUi(self)

        self.ui.actionMenu1.triggered.connect(self.open_my_dialog)

    def open_my_dialog(self):
        my_dialog = QDialog()
        my_dialog.ui = MyDialog()
        my_dialog.ui.setupUi(my_dialog)
        # MainForm.hide(self)
        my_dialog.exec_()
        my_dialog.show()


class MyDialog(QDialog):
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        self.ui = Ui_MyDialog()
        self.ui.setupUi(self)
        self.ui.pushButton_cancel.clicked.connect(self.cancel_dialog)

    def cancel_dialog(self):
        print("Closing Dialog Window...")
        sys.exit()
当我运行此命令并单击相应的菜单按钮时,会出现以下错误:

AttributeError: 'MyDialog' object has no attribute 'setupUi'
错误在这一行:

self.ui.setupUi(self)  # this is under MyDialog Class

如果我直接将代码引用到外部(Ui_MyDialog)文件,而不使用第二个类,我就可以让代码正常工作。但是正如我在开始时所说的,我想从这个文件中控制它,直接在这里进行修改,这样我就不会在将来跟踪对Ui文件的修改。

因为错误发生在这一行

self.ui.setupUi(self)
之前,您将一个
Ui\u MyDialog
实例分配给了
self.Ui

self.ui = Ui_MyDialog()
错误消息应该提到class
Ui\u MyDialog
,而不是
MyDialog

因此,要么您误报了错误消息,要么错误没有发生在“MyDialog类”下

我还要指出:
QWidget
和派生类本身没有
setupUi
方法。这种方法属于uic生成的
Ui.*
类,通常从继承自
Ui.*
类的小部件的构造函数调用

因此,如果要在
MyDialog
实例上调用
setupUi
MyDialog
首先必须从
Ui\u MyDialog
继承

您可以在“打开我的”对话框中调用它:

my_dialog.ui = MyDialog()
my_dialog.ui.setupUi(my_dialog)

我终于让它开始工作了。但在我提供答案之前,我要感谢 @p-a-o-l-o和@LoïcG。。后者一路帮助我。谢谢

当我将代码更改为以下内容时,代码正常工作:

class MainForm(QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)
        self.ui = Ui_MainForm()
        self.ui.setupUi(self)

        self.ui.actionMenu1.triggered.connect(self.open_my_dialog)

    def open_my_dialog(self):
        my_dialog = MyDialog()
        # my_dialog.show()  <-- seems this line is not necessary either
        my_dialog.exec_()  # this alone was enough for the code to work


class MyDialog(QDialog):
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        self.ui = Ui_MyDialog()
        self.ui.setupUi(self)

        self.ui.pushButton_cancel.clicked.connect(self.cancel_dialog)

    def cancel_dialog(self):
        print("Closing Dialog Window...")
        self.close()  # not important but corrected this also.
类主窗体(QMainWindow):
def uuu init uuu(self,parent=None):
超级(MainForm,self)。\uuuu init\uuuuu(父级)
self.ui=ui_MainForm()
self.ui.setupUi(self)
self.ui.actionMenu1.triggered.connect(self.open\u my\u对话框)
def打开我的对话框(自我):
我的对话=我的对话()

#my_dialog.show()外部文件Ui_MyDialog有:
类Ui_MyDialog(对象):
def setupUi(self,MyDialog):
\35;转换qt设计文件的代码
不应该引用主文件中我的类吗?我对MainForm使用这种方式,它可以毫无问题地工作,它也以同样的方式调用setupUi。谢谢@p-a-o-l-o我在测试了我能想到的一切之后输入了答案。我想对你的答案投赞成票,但因为我是新来的,所以不让我这么做。我希望我提供的答案是正确的我认为这个代码不起作用。调用
my\u dialog.show()
,而
my\u dialog
未定义。@LoïcG。对不起。。现在更正它。。更正了这两行代码:MyDialog().show()和MyDialog().exec_389;()我确信它不起作用。不需要测试它。另外,您不需要调用
MyDialog().ui.setupUi(QDialog())
,因为
self.ui.setupUi(self)
已被调用到
MyDialog
的构造函数中,我更正了它。代码起作用了,但我在帖子上使用了代码并复制粘贴了它。。忘记编辑那里的两行了。再次抱歉。代码的工作方式是这样的。如果您看到fit@LoïcG,请撤消您的否决票。对不起,但是
MyDialog()。execï()应该足以打开您的对话框。目前,您实例化了3次
MyDialog