Qt: Как отслеживать изменение Q_PROPERTY на стороне C++ вместо QML
Я использую Qt 5.9.3. В моем приложении указано следующее свойство main.qml
Код:
//main.qml
MyQuickItem {
property color nextColor
onNextColorChanged: {
console.log("The next color will be: " + nextColor.toString())
}
}
// MyQuickItem.h
class MyQuickItem : public QQuickItem {
}
Вопрос:
Как я могу сделать onNextColorChanged
быть определенным в стороне C++?
Я знаю, что я также могу сделать nextColor
как свойство внутри класса C++ MyQuickItem
, вот так
// MyQuickItem.h
class MyQuickItem : public QQuickItem {
Q_PROPERTY(QColor nextColor READ nextColor WRITE setNextColor NOTIFY nextColorChanged)
}
Можно ли контролировать OnNextColorChanged
внутри MyQuickItem
?
1 ответ
Решение
Мы можем использовать QMetaObject для получения свойства и сигнала, затем мы подключаем его по старому стилю:
#ifndef MYQUICKITEM_H
#define MYQUICKITEM_H
#include <QQuickItem>
#include <QDebug>
class MyQuickItem : public QQuickItem
{
Q_OBJECT
public:
MyQuickItem(QQuickItem *parent = Q_NULLPTR): QQuickItem(parent){}
protected:
void componentComplete(){
int index =metaObject()->indexOfProperty("nextColor");
const QMetaProperty property = metaObject()->property(index);
if (property.hasNotifySignal()){
const QMetaMethod s = property.notifySignal();
QString sig = QString("2%1").arg(QString(s.methodSignature()));
connect(this, sig.toStdString().c_str() , this, SLOT(onNextColorChanged()));
}
}
private slots:
void onNextColorChanged(){
int index =metaObject()->indexOfProperty("nextColor");
const QMetaProperty property = metaObject()->property(index);
qDebug()<<"color" << property.read(this);
}
};
#endif // MYQUICKITEM_H
Полный пример можно найти по следующей ссылке.