首页 > 解决方案 > 恢复被拒绝的对话/表单以在重新打开时显示最后接受的值

问题描述

我在程序中设置了一个“选项”对话框,我可以在其中更改一些值并使用确定/取消关闭对话框以接受拒绝我的更改。在使用取消关闭对话框并重新打开它后,我希望显示最后接受的值,但是我知道如何实现这一点。

下面是我的代码的一个非常简化的版本。我选择只实例化一次对话框(而不是每次调用对话框时都创建一个新实例),主要是为了避免__init__ 每次打开对话框时都必须调用保存文件并从保存文件中导入数据。

from PyQt5.QtWidgets import QMainWindow, QPushButton,\
    QApplication, QTextEdit, QDialog, QDialogButtonBox


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        btn = QPushButton('open text 1', self)
        btn.move(10, 10)
        btn.clicked.connect(self.open_dlg)

        self.txtdlg = TextDialog()

    def open_dlg(self):
        if self.txtdlg.exec_() == QDialog.Accepted:
            print(self.txtdlg.preferences)


class TextDialog(QDialog):
    def __init__(self):
        super().__init__()

        self.preferences = "text here"

        self.resize(200, 150)
        self.textedit = QTextEdit(self)
        self.textedit.resize(200, 100)
        self.textedit.setText(self.preferences)
        btns = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, self)
        btns.move(20, 100)
        btns.accepted.connect(self.save_and_close)
        btns.rejected.connect(self.reject)

    def save_and_close(self):
        self.preferences = self.textedit.toPlainText()
        self.accept()


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    MW = MainWindow()
    MW.show()
    sys.exit(app.exec_())

实际上,单击取消后,如果我重新打开对话框,对话框会保留对其小部件的任何未保存的更改。我的第一个想法是将取消按钮连接到 close_without_saving 方法,该方法将对话框更新为关闭前最后保存的值,但如果preferences在对话框不可见时由于某种原因发生更改,则显示的值将不是最新的。我可以在打电话时运行一些代码exec_吗?或者我的实现背后的逻辑是否错误?

标签: pythonpyqt

解决方案


您必须实现一个将对话框的值设置为默认值的方法:

# ...
class MainWindow(QMainWindow):
    # ...

    def open_dlg(self):
        self.txtdlg.reset()
        if self.txtdlg.exec_() == QDialog.Accepted:
            print(self.txtdlg.preferences)


class TextDialog(QDialog):
    # ...

    def reset(self):
        self.preferences = "text here"
        self.textedit.setText(self.preferences)

    def save_and_close(self):
        self.preferences = self.textedit.toPlainText()
        self.accept()
# ...

推荐阅读