我正在围绕这个圈子跑来跑去。只是无法绕过信号和插槽。
只是寻找一些可以在我的C ++中发出信号时自动更新我的UI的机制。
示例:
我在Qml中有两个带有text:_app.method的标签,它返回一个值。
我有一个按钮,onClicked运行Q_INVOKABLE方法。该方法在完成时发出信号,例如,获取地理坐标并更新上述文本:赋值所依赖的值。
我想要的是更新文本的一些事项:一旦这些值发生变化就会进行分配。
我只需要清楚地解释这些信号/插槽。文档中的唯一示例似乎只假设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对象(Button)使用新值调用onValueChanged函数(因为发出valueChanged(m_iValue)。请告诉我,我已经想到了这个??!?!
答案 0 :(得分:10)
如果您使用的是Q_PROPERTY宏,则无需使用明确的函数绑定onValueChanged信号来更改按钮的文本。而且你也不需要用m_iValue发出valueChanged信号。在相应的文件中进行以下提及的更改
QML:
Button {
horizontalAlignment: HorizontalAlignment.Center
verticalAlignment: VerticalAlignment.Center
id: aButton
text: _app.value
onClicked: {
_app.value = _app.value + 1
}
}
HPP:
signals:
void valueChanged();
CPP:
发出valueChanged();