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)