qt - 如何有条件地禁用 QML 绑定到 C++ 后端?
问题描述
我正在为具有大量属性绑定的嵌入式系统开发 QML 应用程序:许多传感器数据显示在应用程序的不同页面中。一次只能看到 1 页。
当我 on 时,即使设置为on page 2
,其属性绑定仍在进行中。我希望 QML 仅在页面为 时响应绑定更新,因为它会提高性能。page 1
visible
false
page 1
visible
我尝试使用Binding
此处描述的元素:绑定 QML 类型和此处:当 QML 对象不可见时防止 QML 属性绑定?,但我注意到绑定仍会在 QML 中更新。
我想知道是否有可能完全消除绑定,如果不是 on 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,在 main.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);
}
传感器数据.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
传感器数据.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
}
解决方案
实际上,似乎Binding
仍在评估该属性,但只是在子句为假时value
不将其分配给该text
属性。when
我会考虑这个越野车,但也许它背后有一个基本原理。
State
解决方案是在下面的代码中使用 a 。这也提供了声明当前未读取该值的可能性。
Rectangle{
x: 280
y: 20
width:200
height:150
color:"red"
Text {
id: readout
y: 76
width: 85
height: 67
text: {
console.log("new value"); //does not print when deactivated
sensorData.sensorReading.toFixed(1)
}
states: [
State {
name: "deactivated"
when: !controlRect.activated
PropertyChanges {
target: readout
text: "off"
}
}
]
}
}
推荐阅读
- scikit-learn - GaussianNB:获取条件概率
- flash - Haxe 与 swf 目标如何嵌入 PNG 图像
- javascript - UI-Grid 未填充 AngularJs
- python - django 项目出现服务器错误(500)
- node.js - 在 MoleculerJS 中构造上下文对象
- python - SQLAlchemy 组合查询
- java - 将我的项目移动到 MacBook 时出错任务“:app:compileFlutterBuildDebug”执行失败
- wordpress - 在 Wordpress 中添加 Google API 时出错
- .net-5 - Blazor WASM 本地开发无法获取远程数据
- javascript - 找不到“页面”目录。NextJS 与 pkg