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。 !
我在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。 !