Python AttributeError:“;“对话”;对象没有属性';setupUi';
我在pyqt5-qt设计器上制作了两个表单。一个是主窗体,第二个是对话框,我将使用它进行用户输入。我将两者都转换为py代码 首先,我应该通知您,我不会修改转换后的Ui.py文件。我更喜欢有一个额外的“主”文件,在其中设置每次修改。我这样做是为了在每次使用Ui文件进行修改时不必进行额外的更改 因此,我在主文件中添加了第二个类,并试图通过菜单项从主窗体类调用它。下面是一些示例代码: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=
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()
错误消息应该提到classUi\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