如何监控变化?

2024-04-20 15:06:14 发布

您现在位置:Python中文网/ 问答频道 /正文

背景故事:

我目前正在开发一个程序,它有几个qComboBoxqLineEdit元素,用户可以将数据输入或选择一个值。当用户选择“新建文件”或“打开文件”时,我想检查是否有任何值已更改,并向用户提供保存其工作的选项。输出文件是XML。你知道吗

问题:

基本上,我只需要知道是否有任何值与默认值不同。我不关心确切的数值有什么不同,我只需要知道它们是不同的。你知道吗

我尝试过使用xmldiff,在程序启动时创建一个包含初始值的元素树,然后将其与第二个元素树和当前值进行比较。它似乎不能给出一个真值或假值,第二个元素树的大小也不尽相同,所以我不认为我可以简单地进行1对1的比较。你知道吗

我尝试的第二件事是在元素更改时简单地设置一个布尔值,但是我无法解释元素被重置为默认值的原因。例如,如果一个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_())

Tags: 文件用户selfevent元素ifdefsys
1条回答
网友
1楼 · 发布于 2024-04-20 15:06:14

默认成员dict:

{ qline1Name: "tata", qcombo: 2, ...}创建一个dict。它将您的instances作为键及其初始值。保存时,检查当前值是否与其中存储的值不同,并相应地执行操作。您必须区分几个用作输入元素的类-对于combobox,可以使用初始选定的索引。你知道吗

衍生/猴子补丁/装饰:

您可以派生/monkey patch/修饰您的Q*-输入,并向它们添加default_value属性。创建时设置,保存时计算:

(Mis-)使用现有字段:

QLineEdit有QLineEdit.placeholderText可用于“defaultvalue”并简单地比较它(除非您的defaultText是空格-它们得到nixx'ed)。你知道吗

更通用的方法是利用^{}QString字段。这样,只有一个属性可以用于所有输入元素,并且您可以if isinstance(...):在将它与实际的QString值进行比较时强制转换它的QString值。你知道吗

相关问题 更多 >