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 发出的信号如何被捕获?的主要内容,如果未能解决你的问题,请参考以下文章

如何在按下“停止”按钮时捕获捆绑的GDB在clion中发出的信号?

信号没有被其他类捕获

信号没有被QSignalSpy捕获

PyQt跨线程发出信号

使用信号或 Q_PROPERTY 更新 QML 对象

Q_PROPERTY NOTIFY 信号及其参数