x
xintrea25 января 2018 г. 5:37

Методика запоминания предыдущего значения в QML

qml, свойство

По причине отсутствия ответов вот в этой теме:


https://evileg.com/forum/topic/457/

...хочу разобраться в более общем вопросе. Вопрос звучит так:

Каким образом в декларативном языке QML можно организовать запоминание предыдущего значения свойства?

То есть, задача состоит в том, чтобы перед любым изменением свойства запомнить его значение в другое свойство. Проблема в том, что существующий механизм сигналов onИмяСвойстваChanged() испускает сигнал об изменении свойства уже после его изменения. И в этом обработчике невозможно получить предыдущее значение свойства чтобы его запомнить.

Кто что думает?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

4
Evgenii Legotckoi
  • 25 января 2018 г. 7:57

Что касается вашего предыдущего вопроса, то посмотрю его, когда появится побольше свободного времени.


Что касается данного вопроса, то можно запоминать самое первое значение некоторой property в другую property при создании QML объекта. Для этого можно использовать обработчик Component.onCompleted

import QtQuick 2.8
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Item {
        id: item
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.bottom: parent.verticalCenter

        property int someProperty: 2
        property int rememberedProperty: 0

        onSomePropertyChanged: {
            console.log("-------------------------")
            console.log(rememberedProperty)
            console.log(someProperty)
            rememberedProperty = someProperty
            console.log(rememberedProperty)
            console.log(someProperty)
        }

        Component.onCompleted: {
            rememberedProperty = someProperty
        }
    }

    Button {
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 20

        text: qsTr("Increase Property")

        onClicked: {
            item.someProperty++
        }
    }
}
Вывод получится следующий
qml: -------------------------
qml: 2
qml: 3
qml: 3
qml: 3
То есть 2 это будет предыдущее значение, а 3 - это уже новое значение.
    x
    • 25 января 2018 г. 13:51

    А теперь скажите, чему будут равны rememberedProperty и someProperty после отработки onSomePropertyChanged() ?

    Правильно, они будут равны.

    Причем, новое событие, устанавливающее еще одно значение someProprty еще не наступило. А они уже равны.

      Evgenii Legotckoi
      • 25 января 2018 г. 14:28
      • (ред.)
      Ой.. ну надо же какой вы привереда...

      import QtQuick 2.8
      import QtQuick.Window 2.2
      import QtQuick.Controls 2.2
      
      Window {
          visible: true
          width: 640
          height: 480
          title: qsTr("Hello World")
      
          Item {
              id: item
              anchors.top: parent.top
              anchors.left: parent.left
              anchors.right: parent.right
              anchors.bottom: parent.verticalCenter
      
              property int someProperty: 2
              property int rememberedProperty: 0
      
              function setSomeProperty(newValue)
              {
                  console.log(rememberedProperty)
                  console.log(someProperty)
                  rememberedProperty = someProperty
                  item.someProperty++
                  console.log(rememberedProperty)
                  console.log(someProperty)
              }
          }
      
          Button {
              anchors.horizontalCenter: parent.horizontalCenter
              anchors.bottom: parent.bottom
              anchors.bottomMargin: 20
      
              text: qsTr("Increase Property")
      
              onClicked: {
                  item.setSomeProperty(item.someProperty + 1)
              }
          }
      }
      Используйте функцию обёртку для установки параметров.

      В принципе, это уж не считая того, что можно в C++ наследоваться от QObject или QQuickItem и написать кастомнный сеттер со всеми плюшками, что захочется.
        Evgenii Legotckoi
        • 25 января 2018 г. 14:32

        Относительно C++ вопрос в другом, пишите ли Вы на нём, или Вам нужно решение только на QML. Если только на QML, то в данном случае только методом обёрткой.

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь
          Lz

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:70баллов,
          • Очки рейтинга1
          РК

          Qt - Тест 001. Сигналы и слоты

          • Результат:84баллов,
          • Очки рейтинга4
          ВМ

          C++ - Тест 001. Первая программа и типы данных

          • Результат:80баллов,
          • Очки рейтинга4
          Последние комментарии
          d
          dblas55 июля 2024 г. 21:02
          QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          k
          kmssr9 февраля 2024 г. 5:43
          Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
          АК
          Анатолий Кононенко5 февраля 2024 г. 12:50
          Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
          EVA
          EVA25 декабря 2023 г. 21:30
          Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
          J
          JonnyJo25 декабря 2023 г. 19:38
          Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
          Сейчас обсуждают на форуме
          BlinCT
          BlinCT25 июня 2024 г. 11:00
          Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
          Evgenii Legotckoi
          Evgenii Legotckoi25 июня 2024 г. 1:11
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          BlinCT
          BlinCT5 мая 2024 г. 15:46
          Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
          Evgenii Legotckoi
          Evgenii Legotckoi3 мая 2024 г. 0:07
          Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
          IscanderChe
          IscanderChe30 апреля 2024 г. 14:22
          Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

          Следите за нами в социальных сетях