6

我在这个圈子里跑来跑去。只是无法将我的头绕在信号和插槽上。

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

例子:

我在 Qml 中有两个带有文本的标签: _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 发生了变化,并且发生了一个发射,它告诉正在收听 valueChanged 的​​人有一个新值。

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

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

4

1 回答 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
    }
}

高压钠灯:

signals:
    void valueChanged();

共产党:

发出 valueChanged();

于 2013-02-18T06:01:08.477 回答