Как ловятся сигналы, испускаемые через Q_PROPERTY?

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() сигнал испускается?

2 ответа

Если вы используете это свойство из C++, вы должны предоставить и подключить слоты самостоятельно, но в Qml, если вы прочитаете остальное:

В приведенном выше примере связанный сигнал NOTIFY для свойства author - это authorChanged, как указано в вызове макроса Q_PROPERTY(). Это означает, что всякий раз, когда сигнал испускается - как это происходит при изменении автора в Message::setAuthor() - это уведомляет механизм QML о том, что любые привязки, связанные со свойством автора, должны быть обновлены, и, в свою очередь, механизм обновит текст свойство, вызывая Message::author() снова.

он говорит, что часть макроса NOTIFY сообщает механизму QML, что он должен подключиться к этому сигналу и обновить все привязки, связанные с этим свойством.

Q_PROPERTY просто выставляет свойство, но фактическая работа происходит в setAuthor, который также испускает сигнал. QML также использует этот метод, если установлено свойство.

ОБНОВИТЬ:

Q: Я хочу знать, где находится слот для этого сигнала?

Слоты в QML находятся в движке QML.

Q: Какой код будет изменен при отправке сигнала authorChanged()?

QML обновляет все привязки, включающие указанное свойство.

Этот код является примером связи между QML (JavaScript) и C++. Этот код выставляет author свойство, так что вы можете добраться до него из кода JavaScript. Если вы изменяете свойство author со стороны C++, вы должны сообщить об этом движку QML. Поле NOTIFY макроса Q_PROPERTY указывает сигнал, и когда он испускается, механизм 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()
    }
}
Другие вопросы по тегам