背景故事:
我目前正在开发一个程序,该程序具有多个qComboBox
和qLineEdit
元素,用户可以在其中输入数据或选择一个值。当用户选择“新建文件”或“打开文件”时,我要检查是否有任何值已更改,并向用户显示保存其工作的选项。输出文件是XML。
问题:
基本上,我只需要知道是否有任何值与默认值不同即可。我不在乎确切的值有什么不同,我只需要知道它们是不同的即可。
我尝试使用xmldiff,方法是在程序启动时创建一个包含初始值的元素树,然后将其与具有当前值的第二个元素树进行比较。它似乎不能够提供正确或错误的值,并且第二个元素树的大小各不相同,因此我认为我不能简单地进行一对一的比较。
我尝试的第二件事只是在元素更改时设置一个布尔值,但是我无法解释将元素重置为默认值的原因。例如,如果qLineEdit
框没有值,并且用户输入了某些内容,则会将布尔值设置为“ true”;但是,如果他们返回并将该值改回默认值,结果也将为“ true”。
我想知道做这种事情是否有“最佳实践”,或者有人可以指出我正确的方向。这似乎在大多数情况下应该是微不足道的,但是我不知道该如何处理。
编辑…添加了第二次尝试的示例。
import sys
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
self.modified = False
self.edit1 = QLineEdit()
layout = QGridLayout(self)
layout.addWidget(self.edit1)
self.edit1.editingFinished.connect(self.valueChanged)
def valueChanged(self):
print('valueChanged Event')
self.modified = True
def closeEvent(self, event):
if self.modified:
prompt = QMessageBox.warning(
self, 'Save Changes?',
'This document has been modified.\n'
'Do you want to save these changes?',
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel, QMessageBox.Cancel
)
if prompt == QMessageBox.Yes:
event.accept()
if prompt == QMessageBox.No:
event.accept()
if prompt == QMessageBox.Cancel:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.setGeometry(600, 100, 300, 100)
window.show()
sys.exit(app.exec_())
答案 0 :(得分:0)
使用dict
创建一个{ qline1Name: "tata", qcombo: 2, ...}
。它以您的instances
作为键及其初始值。保存时,检查当前值是否与存储的当前值不同,并采取相应措施。您必须区分几个用作输入元素的类-对于组合框,可以使用初始选择的索引。
您可以派生/猴子补丁/装饰您的Q *输入,并向它们添加default_value
属性。在创建时进行设置,并在保存时进行评估:
QLineEdit具有QLineEdit.placeholderText,您可以将其用于“默认值”并进行简单比较(除非您的defaultText是空格-它们会被nixx修改)。
更通用的方法是利用QWidget.whatsThis
QString字段。这样,只有一个属性可以用于所有输入元素,并且您可以if isinstance(...):
将其与实际值进行比较时强制转换其QString值。