QML强制绑定更新依赖于C ++函数

时间:2016-02-04 23:40:59

标签: c++ qml

有没有办法强制更新QML中的绑定? 我使用ComboBox.currentText作为参数将Component的状态绑定到c ++函数。

state: cpp.isInSet(combobox.currentText) ? "a" : "b";

正如您可以猜到的,如果给定的文本在QSet中,则c ++函数返回true。 现在,当currentText发生变化时,这显然可以正常工作,但同时我在集合中添加或删除字符串。 当发生这种情况时,我可以发出信号,但我怎么能告诉QML组件更新它的绑定?

作为一个快速而肮脏的黑客,我刚刚做了:

property bool hack: true;
Connections { target: cpp; onSetChanged: {!hack; !hack;}
state: hack && cpp.isInSet(combobox.currentText) ? "a" : "b";

但必须有一种更好的方式,我在文档中找到它太愚蠢了。

2 个答案:

答案 0 :(得分:1)

如果你的cpp对象有" setChanged()"你可以这样做。信号:

function checkState() {
    state = cpp.isInSet(combobox.currentText) ? "a" : "b"
}
Component.onCompleted: {
    cpp.setChanged.connect(checkState)
    combobox.onCurrentTextChanged.connect(checkState)
}

答案 1 :(得分:1)

尝试一下

在您的cpp中添加属性;

Q_PROPERTY(int generation READ generation NOTIFY generationChanged);

这只是一个整数。每当您要从C ++发起更改时,请更改此“世代”编号;

++_generation;
emit generationChanged();

然后在QML中,取决于gen;

(示例)

Item
{
   ...
    property int gen: cpp.generation;
    ...

    state: gen, (cpp.isInSet(combobox.currentText) ? "a" : "b");

}

使用javascript逗号运算符。