AttributeError: "Dialog" object has no attribute 'setupUi'

AttributeError: "Dialog" object has no attribute 'setupUi'

我在pyqt5-qt-designer上做了两个表格。一个是主窗体,第二个是我将用于用户输入的对话框。我将两者都转换为 py 代码。

首先我要通知你我不修改转换后的Ui.py文件。我更喜欢有一个额外的 "Main" 文件来设置每个修改。我这样做是为了不必每次修改 Ui 文件时都进行额外的更改。

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

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) 文件而不使用此处的第二个 class,我可以使代码正常工作。但是正如我在开头所说的那样,我想从这个文件中控制它,直接在此处进行修改,这样我就不会在将来跟踪对 Ui 文件的修改。

鉴于错误发生在这一行

self.ui.setupUi(self)

并且您在

之前将 Ui_MyDialog 实例分配给 self.ui
self.ui = Ui_MyDialog()

错误消息应该提到 class Ui_MyDialog 而不是 MyDialog.

所以,要么你误报了错误信息,要么错误没有发生'under MyDialog Class'。

我还要指出:QWidget 和派生的 classes 本身没有 setupUi 方法。这种方法属于 Ui_* classes,由 uic 生成,通常从 继承自 [=] 的小部件的构造函数中调用44=]一个Ui_*class.

因此,如果您想在 MyDialog 个实例上调用 setupUi,首先 MyDialog 必须继承自 Ui_MyDialog

open_my_dialog中调用它:

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.

希望对您有所帮助!

编辑:由于
,我更正了一些行并使答案更简单 @LoïcG。 !