Pyside + Qt Designer 更好的编码
Pyside + Qt Designer Better Coding
我想改进我的代码,但目前不知道如何改进。
所以我使用 Qt Designer 并创建了一个主 window 加上 3 个可以从主 window 打开的对话框。将 .ui 文件转换为 .py 文件并创建了管理所有文件的 MainWindow class。
一切正常,但对我来说这看起来不对:
class MainWindow(QMainWindow, Ui_MainWindow):
# init and else
[...]
def open_add_dialog(self):
self.dialog = AddDialog()
self.dialog.show()
def open_edit_dialog(self):
self.dialog = EditDialog()
self.dialog.show()
def open_about_dialog(self):
self.dialog = AboutDialog()
self.dialog.show()
def assign_widgets(self):
self.actionAdd.triggered.connect(self.open_add_dialog)
self.actionEdit.triggered.connect(self.open_edit_dialog)
self.actionAbout.triggered.connect(self.open_about_dialog)
代码被简化了。如您所见,我有 3 个几乎相同的方法。所以我想到了一个问题,是否可以将所有内容合并为一个?我想要的是这样的:
def open_dialog(self):
sender = self.sender()
sender.show()
我认为你永远不应该使用 Qt 的 sender
方法,因为它使得从另一个函数调用该方法变得不可能,你只能通过 signal/slot 机制使用它。因此,它在 the documentation 中说:"This function violates the object-oriented principle of modularity"。调试时使用它当然可以。
在你的例子中,方法非常小。您可以在 connect 语句中使用 lambda,这样您就不必创建单独的方法。或者您可以在构造函数中创建对话框并仅连接到 show
方法。像这样:
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
self.add_dialog = AddDialog()
self.edit_dialog = EditDialog()
self.about_dialog = AboutDialog()
def assign_widgets(self):
self.actionAdd.triggered.connect(self.add_dialog.show)
self.actionEdit.triggered.connect(self.edit_dialog.show)
self.actionAbout.triggered.connect(self.about_dialog.show)
我想改进我的代码,但目前不知道如何改进。 所以我使用 Qt Designer 并创建了一个主 window 加上 3 个可以从主 window 打开的对话框。将 .ui 文件转换为 .py 文件并创建了管理所有文件的 MainWindow class。 一切正常,但对我来说这看起来不对:
class MainWindow(QMainWindow, Ui_MainWindow):
# init and else
[...]
def open_add_dialog(self):
self.dialog = AddDialog()
self.dialog.show()
def open_edit_dialog(self):
self.dialog = EditDialog()
self.dialog.show()
def open_about_dialog(self):
self.dialog = AboutDialog()
self.dialog.show()
def assign_widgets(self):
self.actionAdd.triggered.connect(self.open_add_dialog)
self.actionEdit.triggered.connect(self.open_edit_dialog)
self.actionAbout.triggered.connect(self.open_about_dialog)
代码被简化了。如您所见,我有 3 个几乎相同的方法。所以我想到了一个问题,是否可以将所有内容合并为一个?我想要的是这样的:
def open_dialog(self):
sender = self.sender()
sender.show()
我认为你永远不应该使用 Qt 的 sender
方法,因为它使得从另一个函数调用该方法变得不可能,你只能通过 signal/slot 机制使用它。因此,它在 the documentation 中说:"This function violates the object-oriented principle of modularity"。调试时使用它当然可以。
在你的例子中,方法非常小。您可以在 connect 语句中使用 lambda,这样您就不必创建单独的方法。或者您可以在构造函数中创建对话框并仅连接到 show
方法。像这样:
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
self.add_dialog = AddDialog()
self.edit_dialog = EditDialog()
self.about_dialog = AboutDialog()
def assign_widgets(self):
self.actionAdd.triggered.connect(self.add_dialog.show)
self.actionEdit.triggered.connect(self.edit_dialog.show)
self.actionAbout.triggered.connect(self.about_dialog.show)