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 を基本クラスに追加することです。基本クラスにアクセスできません。

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

VehicleinheritsQObjectであるため、マクロTransportVehicleを使用する必要があります。これは、継承せずにメタ オブジェクトが必要な場合です。Q_OBJECTQ_GADGETQObject

直接または間接的に継承するすべてのクラスには、マクロQObjectが必要です。Q_OBJECTあなたはそれを持っていないTransportVehicleので、それのために生成されたメタデータを取得しません.基本クラスのために生成されたメタオブジェクトで立ち往生しています.

于 2016-03-09T18:38:27.683 に答える