Как ловятся сигналы, испускаемые через 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()
}
}