【问题标题】:Pyside + Qt Designer Better CodingPyside + Qt Designer 更好的编码
【发布时间】:2016-11-04 10:00:48
【问题描述】:

我想改进我的代码,但目前不知道如何改进。 所以我使用 Qt Designer 并创建了一个主窗口和 3 个可以从主窗口打开的对话框。将 .ui 文件转换为 .py 文件并创建管理所有文件的 MainWindow 类。 一切正常,但对我来说这看起来不对:

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()

【问题讨论】:

    标签: python pycharm pyside qt-designer


    【解决方案1】:

    我认为你永远不应该使用 Qt 的 sender 方法,因为它使得从另一个函数调用该方法是不可能的,你只能通过信号/槽机制使用它。因此它在the documentation 中说:“这个函数违反了面向对象的模块化原则”。当然,在调试期间使用它是可以的。

    在您的情况下,方法非常小。您可以在连接语句中使用 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)
    

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 2014-12-29
      • 1970-01-01
      • 2015-04-13
      • 2014-10-22
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      相关资源
      最近更新 更多