级联和信号/槽机制

6

我对这个问题一筹莫展。就是想不明白信号和槽的机制。

我在寻找一些机制,当我的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))。
请告诉我我已经理解了这个?!
1个回答

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();

C++:

触发 valueChanged() 信号;


哇...由于SIGNAL/SLOT的魔法,它居然能工作。是否有任何特殊的关键词使其奏效? - James Perih

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接