Я работаю над приложением QML для встроенной системы, которая имеет множество привязок свойств: многие данные датчиков отображаются на разных страницах приложения. Только 1 страница видна одновременно.
Когда я на page 2
, привязки свойств для page 1
все еще имеют место, даже если visible
установлен на false
на page 1
. Я sh хочу, чтобы QML отвечал на обновления привязки, только когда страница visible
, так как это улучшило бы производительность.
Я пытался использовать элемент Binding
, как описано здесь: Тип привязки QML и здесь: Запрет привязок свойств QML, когда объект QML не виден? , но я заметил, что привязка все еще будет обновляться в QML.
Мне интересно, возможно ли полностью устранить привязку, если не на page 1
.
Мой код для моей попытки использования Связующего элемента прилагается ниже. Вместо того, чтобы несколько страниц были видимыми / невидимыми, я использовал кнопку, которая переключает свойство activated
.
main.qml
Rectangle{
x: 280
y: 20
width:200
height:150
color:"red"
Text {
y: 76
width: 85
height: 67
text: "off"
Binding on text {
value: {
// I am surprised to find this prints, regardless of value of controlRect.activated
console.log("new value");
sensorData.sensorReading.toFixed(1)
}
when: controlRect.activated
}
}
}
Rectangle{
id: controlRect
x: 20
y: 20
width:200
height:150
property bool activated: true
color:{
if (controlRect.activated){
"green"
}
else{
"yellow"
}
}
MouseArea {
anchors.fill: parent
onClicked: {
console.log("State changed to",!parent.activated);
parent.activated = !parent.activated
}
}
}
backend. cpp, создается в основном. cpp
#include "backend.h"
#include <QQmlContext>
Backend::Backend(QQmlApplicationEngine* engine, QObject *parent) :
QObject(parent)
{
sensorData = new SensorData();
QQmlContext* ctxt(engine->rootContext());
// Connecting back end object instances to front end
ctxt->setContextProperty("sensorData", sensorData);
}
sensordata.h
#ifndef SENSORDATA_H
#define SENSORDATA_H
#include <QObject>
#include <QTimer>
class SensorData : public QObject
{
Q_OBJECT
public:
Q_PROPERTY(double sensorReading MEMBER m_sensorReading NOTIFY sensorReadingChanged)
explicit SensorData(QObject *parent = nullptr);
~SensorData() {}
private:
double m_sensorReading;
double temp;
QTimer m_timer;
signals:
void sensorReadingChanged();
public slots:
void slot_updateReading();
};
#endif // SENSORDATA_H
sensordata. cpp
#include "sensordata.h"
#include <QDebug>
SensorData::SensorData(QObject *parent) :
QObject(parent)
{
// for simulating sensor data
srand( (unsigned)time(NULL) );
m_timer.setInterval(100);
m_timer.setSingleShot(false);
QObject::connect(&m_timer, &QTimer::timeout, this, &SensorData::slot_updateReading);
m_timer.start();
}
// simulate my sensor data
void SensorData::slot_updateReading(){
m_sensorReading = modf(rand() / 100000.0, &temp);
emit sensorReadingChanged(); // emit for QML binding to update
}