如何在依赖属性更改时重新计算绑定到 qml 属性的 c++ 函数
How to re-evaluate c++ function bound to qml property on dependent property change?
我想将C++类的方法绑定到 QML 组件属性,并在依赖属性更改时重新评估它。以下 QML 组件可以执行我想要的操作:
// Converter.qml:
import QtQuick 2.0
QtObject {
property double rate: 1
function exchange(amount) { return amount * rate }
}
如果我将 exchange
函数的结果分配给这样的属性,
Text { text: converter.exchange(100) }
文本元素将在更改rate
时自动更新。 这适用于 QML 组件,但我不知道如何使用 C++ 类来做到这一点。
我想在C++中实现一个功能等效的类:
#include <QObject>
class Convert : public QObject
{
Q_OBJECT
Q_PROPERTY(double rate READ rate WRITE setRate NOTIFY rateChanged)
public:
explicit Convert(QObject *parent = 0)
: QObject(parent), m_rate(1.0)
{ }
signals:
void rateChanged();
public slots:
double exchange(double amount) { return m_rate * amount; }
double rate() { return m_rate; }
void setRate(double r) {
m_rate = r;
emit rateChanged();
}
private:
double m_rate;
};
rate
属性可以从 QML 访问,但更改它不会向 QML 引擎发出应重新评估"交换"的信号。
这是我的主要.qml:
// main.qml
import QtQuick 2.1
import QtQuick.Controls 1.1
import Utils 1.0
ApplicationWindow {
width: 300; height: 200
visible: true
// Converter { id: converter; rate: rateField.text }
CppConverter { id: converter; rate: rateField.text }
Column {
TextField { id: rateInput; text: '0.41' }
TextField { id: amountInput; text: '100.00' }
Text { id: output; text: converter.exchange(amountField.text).toFixed(2) }
}
}
如果我启用CppConverter
,则当我更改amountInput
时输出会更新,但在更改rateInput
时不会更新。 如果我在 QML 转换器元素中发表评论,则更新工作正常。
转换器,QML 运行时识别对速率属性的依赖关系,并在速率更改时重新评估交换函数。 如何指示 QmlEngine 在C++版本中执行相同的操作?
目前没有办法做到这一点。
不过,我不认为依赖像这样重新评估的函数是一种好的做法。必要时应显式调用它:
Connections {
target: converter
onRateChanged: output.text = converter.exchange(amountField.text)
}
或者将 exchange(( 转换为属性,并以声明方式而不是命令性方式处理它(代码不完整或未经测试(:
class Convert : public QObject
{
// ...
Q_PROPERTY(double amount READ amount WRITE setAmount NOTIFY amountChanged)
Q_PROPERTY(double exchange READ exchange NOTIFY exchangeChanged)
// ...
public:
double exchange() { return m_rate * m_amount; }
private:
double m_rate;
double m_amount;
};
然后,您需要在适当的位置发出各种*更改信号等。
相关文章:
- 如果着色器中未使用绑定属性位置,是否会对其进行惩罚
- QML 检测到属性宽度的绑定循环(TextMetrics 行为很奇怪)
- 从高度动态的C 数据模型中更新QML:计时器与属性绑定
- 如何将C++属性绑定到 QML 属性
- 在 emscripten 中绑定属性和函数时出错
- 如何将C++函数绑定到xaml文本块属性
- 属性通知在C /CX绑定中更改了
- 是否可以为现有类的实例绑定新属性,例如 c++ 中的 JavaScript?
- Boost图库:可以将绑定属性与内部属性相结合
- QML中属性绑定评估的顺序和方式
- Qt 属性、底层数据成员、绑定和开销
- 如何在依赖属性更改时重新计算绑定到 qml 属性的 c++ 函数
- C++有什么好的方法可以将属性与WinAPI控件绑定
- BGL:使用绑定属性来存储另一个顶点的顶点描述符
- 具有多个线程的 QML C++ 属性绑定
- 外部属性映射绑定到std::矢量在boost图形库
- 绑定和动态属性
- c++类中const属性的后期绑定
- 使用类属性作为数组绑定
- 绑定复选框'checked'具有C++对象Q_PROPERTY的属性