Как вести мониторинг изменений? - PullRequest
0 голосов
/ 07 сентября 2018

Предыстория:

В настоящее время я разрабатываю программу, которая имеет несколько элементов qComboBox и qLineEdit, в которые пользователь может вводить данные или выбирать значение. Когда пользователь выбирает «Новый файл» или «Открыть файл», я хочу проверить, изменились ли какие-либо значения, и предоставить пользователю возможность сохранить свою работу. Выходной файл - XML.

Проблема:

По сути, мне просто нужно знать, отличаются ли какие-либо значения от значений по умолчанию. Меня не интересует, какие именно значения отличаются, мне просто нужно знать, что они разные.

Я попытался использовать xmldiff, создав Дерево элементов, которое содержит начальные значения при запуске программы, а затем сравнил его со вторым Деревом элементов с текущими значениями. Похоже, что он не может просто дать истинное или ложное значение, а второе Дерево Элементов различается по размеру, поэтому я не думаю, что могу просто сделать сравнение 1 к 1.

Второе, что я попробовал, было просто установить логическое значение, когда элемент изменился, но я не мог объяснить сброс элемента к значению по умолчанию. Например, если поле qLineEdit не имеет значения и пользователь вводит что-то, это установит логическое значение в «true»; однако, если они вернутся и вернут это значение к значению по умолчанию, результатом будет также «true».

Мне было интересно, есть ли «лучшая практика» для таких вещей или кто-то может указать мне правильное направление. Кажется, по большей части это должно быть тривиально, но я не знаю, как к этому подойти.

EDIT… Добавлен пример для второй попытки.

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_())

1 Ответ

0 голосов
/ 07 сентября 2018

Member-dict со значениями по умолчанию:

Создайте dict с { qline1Name: "tata", qcombo: 2, ...}. Он содержит ваш instances в качестве ключа и его начальную стоимость. При сохранении проверьте, отличается ли какое-либо текущее значение от того, что хранится в нем, и действуйте соответствующим образом. Вы должны различать пару классов, используемых в качестве входных элементов - для комбинированного списка можно использовать исходный выбранный индекс.

Извлечение / обезьяна патч / украсить:

Вы можете получить / monkey patch / украсить ваши Q * -входы и добавить к ним свойство default_value. Установите его при создании и оцените при сохранении:

(Mis-) использовать существующие поля:

QLineEdit имеет QLineEdit.placeholderText , который вы можете использовать для "defaultvalue" и просто сравнить его (если ваш defaultText - это пробелы - они получают nixx'ed).

Более общий подход заключается в использовании поля QWidget.whatsThis QString. Таким образом, только одно свойство может использоваться для всех входных элементов, и вы можете if isinstance(...): привести его значение QString при сравнении его с фактическим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...