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()
信号时会改变哪些代码?
答案 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更新涉及指定属性的所有绑定。