Я настраиваю диалоговое окно «Параметры» в программе, где я могу изменить некоторые значения и закрыть диалог с помощью кнопок «ОК / Отмена», чтобы принять отклонение моих изменений.После закрытия диалога с отменой и повторного его открытия я бы хотел, чтобы отображались последние принятые значения, однако я точно знаю, как это реализовать.
Ниже приведена очень упрощенная версия моего кода.Я решил создать диалоговое окно только один раз (в отличие от создания нового экземпляра каждый раз, когда я вызываю диалоговое окно), главным образом, чтобы избежать необходимости вызывать __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_
?Или логика моей реализации как-то не так?