python - 恢复被拒绝的对话/表单以在重新打开时显示最后接受的值
问题描述
我在程序中设置了一个“选项”对话框,我可以在其中更改一些值并使用确定/取消关闭对话框以接受拒绝我的更改。在使用取消关闭对话框并重新打开它后,我希望显示最后接受的值,但是我知道如何实现这一点。
下面是我的代码的一个非常简化的版本。我选择只实例化一次对话框(而不是每次调用对话框时都创建一个新实例),主要是为了避免__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_
吗?或者我的实现背后的逻辑是否错误?
解决方案
您必须实现一个将对话框的值设置为默认值的方法:
# ...
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()
# ...
推荐阅读
- html - 有没有办法让内部 CSS 表格扩展外部 CSS 表格的整个宽度?
- r - 根据另一个输入 r shiny 更改输入值
- javascript - 使用来自其他 npm 包的 gulp 文件(导入最终会存在的文件)
- reactjs - 请帮我!我不知道我做错了什么
- python - 如何使用 pyinstaller 将 chromedriver.exe 与在 selenium webdriver 上运行的 python 脚本合并?
- r - 错误地更改R中的内置数据框,如何改回来
- twitter-bootstrap - 如何使用自定义颜色@extend 引导类
- kubernetes - 如何在没有端口转发的情况下从本地机器访问 kubernet 服务?
- c# - 为什么在 Threading.Timer 中使用 Icon.FromHandle 设置 NotifyIcon.Icon 会导致内存泄漏?
- python - 在以下路径中找不到名为“lab”的模板子目录