【问题标题】:How are signals emitted through Q_PROPERTY caught?Q_PROPERTY 发出的信号如何被捕获?
【发布时间】: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() 信号发出时,哪些代码会发生变化?

【问题讨论】:

    标签: c++ qt qml qproperty


    【解决方案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()
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多