我对这个问题一筹莫展。就是想不明白信号和槽的机制。
我在寻找一些机制,当我的C++中发生信号时,可以自动更新我的UI。
例如:
我有两个Qml标签,它们的文本是:_app.method返回一个值。
我有一个按钮,当点击它时,会运行一个Q_INVOKABLE函数。当该函数完成后,它会发出一个信号,比如获取地理坐标,并更新上面文本的值。
我想要的是当这些值改变时,SOMETHING即可更新文本的值。
我只需要简单地解释这些信号/槽。文档中的示例似乎只假定只使用QML或C++,而不是两者混合使用。示例代码有例子,但在文档中没有具体说明。
如果您能提供简单的描述,我相信我可以适应它。例如:1:在QML中定义这个,2:在hpp文件中定义这个,3:在cpp文件中定义这些。
我尝试过使用QObject的setPropery("text","value"),但我的应用程序在尝试此操作时崩溃。
告诉我如果我错了...
1)在QML中:
Button {
id: aButton
text: _app.value
onClicked: {
_app.valueChanged.connect(aButton.onValueChanged);
_app.value = _app.value + 1;
}
function onValueChanged (val) {
aButton.text = "New value: " + val;
}
}
2) 在 HPP 中:
Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
public:
int value();
void setValue(int i);
signals:
void valueChanged(int);
private:
int m_iValue;
3)在 CPP 中:
int class::value()
{
return m_iValue;
}
void class::setValue(int i)
{
// name is same as HPP WRITE Q_PROPERTY statement
m_iValue = i;
emit valueChanged(m_iValue);
}
因此,在QML中,onClick方法将信号与QML函数连接起来;这意味着,现在我们正在监听值的变化,当它发生时,该函数将被调用。然后,我们改变值...由于Q_PROPERTY将写入值设置为名为setValue的函数,因此使用新值调用setValue;在内部,m_iValue被更改,并发生了一个emit,告诉任何正在听取valueChanged的人有一个新值。
嘿,我的QML正在监听它!(通过_app.valueChanged.connect脚本)。因此,正在侦听的QML对象(按钮)会调用其onValueChanged函数,其中包含新值(由于发出valueChanged(m_iValue))。
请告诉我我已经理解了这个?!