存储(QDialog)变量的替代方法,即使它们关闭 - 来自任何 Class(育儿??)

Alternative way for storing (QDialog) variables, even when they close - from any Class (Parenting??)

我正在尝试在 Python 中找到一种更好的编码方式。 (才写了几个星期。)

总结:找到一种更好的方法来保存(和访问)在关闭对话框(在另一个 class 中调用)中输入的变量值。必须能够使用 class.

中的这些值

我使用 QtDesigner 制作了一个主 window 和一个对话框。一旦我从 window 主菜单中单击 "Settings" 菜单,我就会打开 "MyDialog"。我有一些可以更改的设置。我在对话框中还有一个 "Save" 按钮用于保存我的设置。这是一个示例代码:

up = down = left = right = 0

class MainForm(QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)
        self.ui = Ui_MainForm()
        self.ui.setupUi(self)

        self.ui.actionSettings.triggered.connect(self.open_my_dialog)

    def open_my_dialog(self):
        my_dialog = MyDialog()
        my_dialog.exec_()


class MyDialog(QDialog):
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        self.ui = Ui_MyDialog()
        self.ui.setupUi(self)

        self.ui.pushButton_save.clicked.connect(self.save_dialog)

        self.ui.spinBox_up.setValue(up)
        self.ui.spinBox_down.setValue(down)
        self.ui.spinBox_left.setValue(left)
        self.ui.spinBox_right.setValue(right)

    def save_dialog(self):
        global up, down, left, right

        up = self.ui.spinBox_up.value()
        down = self.ui.spinBox_down.value()
        left = self.ui.spinBox_left.value()
        right = self.ui.spinBox_right.value()
        self.close()

一旦从 classes(MainForm 或再次重新进入对话框;MyForm() 和 MyDialog)关闭对话框,我需要能够访问对话框中输入的值()).如您所见,我将设置保存在缓存中的方式是将它们分配给全局变量。我知道这不是正确的做法。但是我需要在单击 "Save" 按钮后保存设置,这样如果我重新打开对话框,它会显示我上次留在那里的设置(当我单击保存时)。此外,我还必须使用 MainForm() class 中的这些相同值。我阅读了很多关于在其他 class 上调用 class 和方法变量的内容。还有育儿(这让我有点困惑)。但是这些例子非常简单。如果我像他们给你的那样从头开始写 class ,我就明白了。但是因为我使用设计器 Ui 我有一个(方式)不同的代码(很多 self.ui.xxx(xxselfxx) 东西(还有 init与在线示例有很大不同。我尝试并搜索了很多答案但放弃并用全局变量解决了它。

如果有人愿意向我解释解决这个问题的正确(Pythonic)方法,我将非常感激。

谢谢!

经过数小时的测试和研究,我发现了一种更好的编码方法。我现在可以使用 class 变量来完成我的代码,而不是像以前那样使用 "frowned upon" 全局变量。我也试图让它与实例变量一起工作,但不幸的是,无论我做什么,它都不起作用。我提供的答案更 Pythonic/proper 方式..我敢肯定。但这并不意味着这是最好的方法。我仍然愿意接受建议。如果您认为它可以写得更好(也许是实例变量?)请务必分享。

给你:

class MainForm(QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)
        self.ui = Ui_MainForm()
        self.ui.setupUi(self)

        self.ui.actionSettings.triggered.connect(self.open_my_dialog)

    def open_my_dialog(self):
        my_dialog = MyDialog()
        print("Test:", MyDialog.up, MyDialog.down, MyDialog.left, MyDialog.right)  # for testing the values from this class
        my_dialog.exec_()


class MyDialog(QDialog):
    up = down = left = right = 0
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        self.ui = Ui_MyDialog()
        self.ui.setupUi(self)

        self.ui.pushButton_save.clicked.connect(self.save_dialog)

        self.ui.spinBox_up.setValue(MyDialog.up)
        self.ui.spinBox_down.setValue(MyDialog.down)
        self.ui.spinBox_left.setValue(MyDialog.left)
        self.ui.spinBox_right.setValue(MyDialog.right)

    def save_dialog(self):
        MyDialog.up = self.ui.spinBox_up.value()
        MyDialog.down = self.ui.spinBox_down.value()
        MyDialog.left = self.ui.spinBox_left.value()
        MyDialog.right = self.ui.spinBox_right.value()
        self.close()
        return MyDialog.up, MyDialog.down, MyDialog.left, MyDialog.right