级联和信号/槽

cascades and signals / slots

本文关键字:信号 级联      更新时间:2023-10-16

我正在为此兜圈子。我就是无法理解信号和插槽。

只是在寻找一些机制,当我的C++中出现信号时,可以自动更新我的UI。

示例:

我在Qml中有两个标签,它们有文本:_app.method,返回一个值。

我有一个按钮,它在Clicked上运行一个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被更改,并发生发射,这告诉正在收听valueChanged的人有一个新值。

嘿,我的QML正在听!(通过_app.valueChanged.connect脚本)。因此,监听它的QML对象(按钮)调用了onValueChanged函数,并使用新值(因为emit valueChanged(m_iValue))。

请告诉我我已经想通了??!?!

如果使用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:

emit valueChanged();