Доступ к Q_Properties класса, унаследованного от объекта, унаследованного от QObject

У меня есть следующая упрощенная установка, где я пытаюсь получить доступ к Q_Properties унаследованного класса класса, который наследуется от QObject. Я могу получить доступ к свойствам базового класса просто отлично, но я не могу найти или увидеть (при отладке) свойства моего унаследованного класса:

Базовый класс:

class Vehicle : public QObject
{
   Q_OBJECT
   Q_PROPERTY(QString model READ getModel WRITE setModel)      
public:
   explicit Vehicle(QObject *parent = 0);
   QString getModel() const;      
   void setModel(QString model);
   virtual QString toString() const;
private:
    QString _model;
};

Унаследованный класс:

class TransportVehicle : public Vehicle
{
    Q_PROPERTY(int Capacity READ getCapacity WRITE setCapacity)

public:
    TransportVehicle();
    TransportVehicle(int, QString, int);
    int getCapacity() const;
    void setCapacity(int);

    QString toString() const;
private:
    int _maxCapacity;
};

и следующий фрагмент из универсального метода для доступа к свойствам любого объекта, который он находит в списке, который ему передается:

int write(QObjectList* list) {
int count = 0;
for(int i = 0; i < list->size(); i++)
{
    const QMetaObject *mo = list->at(i)->metaObject();
    for(int k = mo->propertyOffset(); k < mo->propertyCount(); k++)
    {
        const QMetaProperty prop = mo->property(k);
        QString name = prop.name();
        QString valStr = prop.read(list->at(i)).toString();
        QDebug << name << ": " << valStr << endl; 
        count++;
    }
    delete mo;
}
return count;
}

Он работает нормально, за исключением того, что мой вывод будет похож на "модель: Тойота" и не будет включать емкость.

Единственный способ получить свойства моих подклассов - это добавить виртуальные методы get и set и дополнительный Q_property к моему базовому классу, что кажется неправильным и невозможным в обычных обстоятельствах, когда я не могу у меня нет доступа к базовому классу.

2 ответа

Решение

Vehicle наследуется QObject, так TransportVehicle придется использовать Q_OBJECT макро, Q_GADGET когда ты не наследуешь QObject и хочу мета-объект.

Каждый класс который прямо по косвенно наследует QObject нуждается в Q_OBJECT макро. У вас его нет TransportVehicle поэтому вы не получите метаданные, сгенерированные для него, вы застряли с мета-объектом, сгенерированным для базового класса.

Вы не используете макрос Q_OBJECT:

class TransportVehicle : public Vehicle
{
    Q_OBJECT
    ^^^^^^^^
    Q_PROPERTY(int Capacity READ getCapacity WRITE setCapacity)

public:
    TransportVehicle();
    TransportVehicle(int, QString, int);
    int getCapacity() const;
    void setCapacity(int);

    QString toString() const;
private:
    int _maxCapacity;
};

Для документации, пожалуйста, смотрите: http://doc.qt.io/qt-5/qobject.html

Другие вопросы по тегам