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?


person TheWaterProgrammer    schedule 15.02.2018    source источник
comment
Это помогает? stackoverflow.com/questions/48813037/   -  person Flopp    schedule 15.02.2018
comment
Просто подключите какой-нибудь слот к сигналу nextColorChanged внутри MyQuickItem.   -  person Evgeny    schedule 15.02.2018


Ответы (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

Полный пример можно найти по следующей ссылке.

person eyllanesc    schedule 15.02.2018