Q_PROPERTY 发出的信号如何被捕获?
Posted
技术标签:
【中文标题】Q_PROPERTY 发出的信号如何被捕获?【英文标题】:How are signals emitted through Q_PROPERTY caught? 【发布时间】:2017-11-13 09:45:17 【问题描述】: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()
信号发出时,哪些代码会发生变化?
【问题讨论】:
【参考方案1】:如果您在 C++ 中使用此属性,您必须自己提供并连接插槽,但如果您阅读其余部分,则在 Qml 中:
在上面的例子中,为作者关联的 NOTIFY 信号 属性是 authorChanged,在 Q_PROPERTY() 宏中指定 称呼。这意味着无论何时发出信号——就像当 Message::setAuthor() 中的作者更改——这会通知 QML 引擎,任何涉及作者属性的绑定都必须是 更新,反过来,引擎将更新文本属性 再次调用 Message::author()。
它表示宏的 NOTIFY 部分通知 QML 引擎它必须连接到此信号并更新所有涉及此属性的绑定。
Q_PROPERTY 只是公开属性,但实际工作发生在 setAuthor 中,它也发出信号。如果设置了属性,QML 也会使用此方法。
更新:
问:我想知道这个信号的插槽在哪里?
QML 中的 slots 在 QML 引擎中。
问:发出 authorChanged() 信号时,哪些代码会发生变化?
QML 更新所有涉及指定属性的绑定。
【讨论】:
【参考方案2】:此代码是 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()
【讨论】:
以上是关于Q_PROPERTY 发出的信号如何被捕获?的主要内容,如果未能解决你的问题,请参考以下文章