如何通过Q_PROPERTY发出信号?

时间:2017-11-13 09:45:18

标签: c++ qt qml qproperty

http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html

class Message : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
public:
    void setAuthor(const QString &a) {
        if (a != m_author) {
            m_author = a;
            emit authorChanged();
        }
    }
    QString author() const {
        return m_author;
    }
signals:
    void authorChanged();
private:
    QString m_author;
};

他们写了emit authorChanged();

我想知道这个信号的插槽在哪里?

发出authorChanged()信号时会改变哪些代码?

2 个答案:

答案 0 :(得分:0)

此代码是QML(JavaScript)和C ++之间通信的示例。此代码公开author属性,因此您可以从JavaScript代码中获取它。如果从C ++端更改author属性,则必须通知QML引擎。 Q_PROPERTY宏的NOTIFY字段表示信号,当它发出时,QML引擎重新读取该属性。

Message {
    id: msg
    author: "Me"        // this property was defined in c++ side with the 
                        // Q_PROPERTY macro.
}

Text {
    width: 100; height: 100
    text: msg.author    // invokes Message::author() to get this value

    Component.onCompleted: {
        msg.author = "Jonah"  // invokes Message::setAuthor()
    }
}

答案 1 :(得分:0)

如果您在C ++中使用此属性,则必须自己提供并连接插槽,但如果您阅读其余部分,则在Qml中:

  

在上面的例子中,作者的相关NOTIFY信号   property是authorChanged,在Q_PROPERTY()宏中指定   呼叫。这意味着每当发出信号时 - 就像它发出的那样   作者在Message :: setAuthor()中进行了更改 - 这会通知QML   任何涉及author属性的绑定必须是引擎   更新,反过来,引擎将更新文本属性   再次调用Message :: author()。

它表示宏的NOTIFY部分通知QML引擎必须连接到此信号并更新涉及此属性的所有绑定。

Q_PROPERTY只暴露属性,但实际工作发生在setAuthor中,它也会发出信号。如果设置了属性,QML也会使用此方法。

<强>更新

问:我想知道此信号的插槽在哪里?

QML中的 slots 位于QML引擎中。

问:当发出authorChanged()信号时,哪些代码会被更改?

QML更新涉及指定属性的所有绑定。