访问从继承自QObject的Object继承的类的Q_Properties

时间:2016-03-09 16:55:13

标签: c++ qt inheritance qproperty

我有以下简化设置,我试图访问继承自QObject的类的继承的类的Q_Properties。我可以很好地访问基类的属性,但是我无法找到或看到(在调试时)我继承的类的属性:

基类:

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;
}

它的工作正常,但我的输出将类似于&#39; model:toyota&#39;并且不会包括容量。

我能够获得子类属性的唯一方法是向我的基类添加虚拟get和set方法以及一个额外的Q_property,这看起来根本不对,并且不可能在正常情况下,我无法访问基类。

2 个答案:

答案 0 :(得分:0)

您缺少使用宏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

答案 1 :(得分:0)

Vehicle继承QObject,因此TransportVehicle必须使用Q_OBJECT宏,Q_GADGET是您未继承QObject的时候并想要一个元对象。

直接间接继承QObject的每个类都需要Q_OBJECT宏。你没有在TransportVehicle中拥有它,所以你没有为它生成元数据,你就会遇到为基类生成的元对象。