0

我有以下简化的设置,我试图访问从 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;
}

它工作正常,除了我的输出将像“模型:丰田”并且不包括容量。

我能够获取子类属性的唯一方法是向我的基类添加虚拟 get 和 set 方法以及一个额外的 Q_property,这在我不这样做的正常情况下似乎根本不正确并且不可能t 有权访问基类。

4

2 回答 2

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

于 2016-03-09T17:18:41.197 回答
0

Vehicle继承QObject,所以TransportVehicle必须使用Q_OBJECT宏,Q_GADGET当你不继承QObject并想要一个元对象时。

每个直接间接继承QObject的类都需要Q_OBJECT宏。你没有它,TransportVehicle所以你没有为它生成元数据,你被为基类生成的元对象卡住了。

于 2016-03-09T18:38:27.683 回答