2

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()发出信号时,哪些代码会发生变化?

4

2 回答 2

3

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

在上面的示例中,作者属性的相关 NOTIFY 信号是 authorChanged,如 Q_PROPERTY() 宏调用中指定的那样。这意味着无论何时发出信号——就像作者在 Message::setAuthor() 中更改时一样——这会通知 QML 引擎任何涉及作者属性的绑定都必须更新,反过来,引擎将更新文本再次调用 Message::author() 属性。

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

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

更新:

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

QML 中的插槽位于 QML 引擎中。

问:发出 authorChanged() 信号时,哪些代码会发生变化?

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

于 2017-11-13T10:00:30.977 回答
0

此代码是 QML (JavaScript) 和 C++ 之间通信的示例。此代码公开了该author属性,因此您可以从 JavaScript 代码中访问它。如果您从 C++ 端更改作者属性,则必须通知 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()
    }
}
于 2017-11-13T09:59:52.400 回答