x
Jan. 25, 2018, 4:37 p.m.

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

qml, свойство

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


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

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

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

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

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

2

Do you like it? Share on social networks!

4
Evgenii Legotckoi
  • Jan. 25, 2018, 6:57 p.m.

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


Что касается данного вопроса, то можно запоминать самое первое значение некоторой 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
    • Jan. 26, 2018, 12:51 a.m.

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

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

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

      Evgenii Legotckoi
      • Jan. 26, 2018, 1:28 a.m.
      • (edited)
      Ой.. ну надо же какой вы привереда...

      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
        • Jan. 26, 2018, 1:32 a.m.

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

          Comments

          Only authorized users can post comments.
          Please, Log in or Sign up
          • Last comments
          • IscanderChe
            April 12, 2025, 5:12 p.m.
            Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
          • AK
            April 1, 2025, 11:41 a.m.
            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
          • Evgenii Legotckoi
            March 9, 2025, 9:02 p.m.
            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
          • VP
            March 9, 2025, 4:14 p.m.
            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
          • ИМ
            Nov. 22, 2024, 9:51 p.m.
            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…