gpt4 book ai didi

c++ - 如何在依赖属性更改时重新评估绑定(bind)到 qml 属性的 C++ 函数?

转载 作者:太空狗 更新时间:2023-10-29 21:19:48 27 4
gpt4 key购买 nike

我想将 C++ 类的方法绑定(bind)到 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 更改时,Text 元素将自动更新。这适用于 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 引擎发出“交换”应该重新评估的信号。

这是我的 main.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 Converter 元素中添加注释,则更新工作正常。

使用 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;
};

然后您需要在适当的位置发出各种 *Changed 信号等。

关于c++ - 如何在依赖属性更改时重新评估绑定(bind)到 qml 属性的 C++ 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26332943/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com