У меня есть следующая упрощенная установка, где я пытаюсь получить доступ к 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;
}
Он работает нормально, за исключением того, что мой вывод будет похож на «модель: Toyota» и не будет включать емкость
Единственный способ получить свойства моих подклассов — это добавить виртуальные методы get и set и дополнительный Q_property к моему базовому классу, что кажется неправильным и невозможным в обычных обстоятельствах, когда я не могу у меня нет доступа к базовому классу.
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#Q_OBJECT