代码之家  ›  专栏  ›  技术社区  ›  shafuq

AttributeError:“Dialog”对象没有属性“setupUi”

  •  0
  • shafuq  · 技术社区  · 7 年前

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   p-a-o-l-o    7 年前

    假设错误发生在这一行

    self.ui.setupUi(self)
    

    您分配了 Ui_MyDialog 实例到 self.ui 之前

    self.ui = Ui_MyDialog()
    

    错误消息应该是类 Ui\u MyDialog 而不是 MyDialog .

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

    我还要指出: QWidget 派生类没有 setupUi 方法本身。该方法属于 Ui_* 类,由生成 uic公司 ,通常从小部件的构造函数调用 继承自 用户界面_*

    如果你想打电话 setupUi 在…上 我的对话框 实例, 我的对话框 必须继承自 Ui\u MyDialog ,首先。

    你呢 打电话进来 open_my_dialog :

    my_dialog.ui = MyDialog()
    my_dialog.ui.setupUi(my_dialog)
    
        2
  •  0
  •   shafuq    7 年前

    我终于成功了。但在我提供答案之前,我要感谢 @p-a-o-l-o和@LocG。。后者一路帮助我。谢谢

    当我将代码更改为以下内容时,代码有效:

    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.
    

    我希望这有帮助!

    编辑:我更正了一些行,并使答案更简单,感谢
    @LocG!