0

C++ で QML オブジェクトからいくつかのプロパティをシリアル化する必要があります

以下の例:

import QtQuick 2.0

Rectangle {
    property color fromcolor: "#0000FF"
    property color tocolor: "#000000"
    property int speed: 5000

    // brave workaround :)
    readonly property string serializable_properties: "fromcolor,tocolor,speed"
    ...
}

で指定されたプロパティをシリアル化するだけで済みますserializable_properties

名前を文字列にリストせずにプロパティをシリアル化するようにマークするより良い方法はありますか? これは、プロパティ名が変更されたときのバグを防ぐためです。

これまでは、serializable_properties次のように使用していました。

const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i=0; i<count; ++i)
{
    QMetaProperty metaproperty = metaobject->property(i);
    const char *name = metaproperty.name();
    QVariant value = object->property(name);

    qDebug() << name << value;
}

更新:

答えてくれてありがとう、私はこのアプローチを次のように改善しました:

  • プライベートとしてマークされたサフィックス "_p" を持つプロパティを除く、クラスのすべてのプロパティを列挙します。

    const QObject *object = qobject_cast<QObject *>( qml_object );
    const QMetaObject *metaobject = object->metaObject();
    int count = metaobject->propertyCount();
    
    for (int i=metaobject->propertyOffset(); i<count; ++i)
    {
        QMetaProperty metaproperty = metaobject->property(i);
        const char *name = metaproperty.name();
        const QString p_name = QString::fromLatin1(name);
        QVariant value = object->property(name);
    
        if( p_name.endsWith(QStringLiteral("_p")) ) continue;
    
        qDebug() << name << value;
    }
    

そして最終的なQML:

Rectangle {
    id: this
    property color fromcolor: "#0000FF"
    property color tocolor: "#000000"
    property int speed: 5000
    property alias mwidth: this.width  // if you want to serialize parent class width
    property int internal_var_p: 5
}
4

2 に答える 2

1

最も簡単な方法は、プロパティ名にプレフィックスまたはサフィックスを追加することです。このようなプレフィックス/サフィックスは、プロパティのリストを反復処理するときに簡単に検出できます。たとえば、プロパティは で始まるserか、 で終わる可能性があり_ます。

Rectangle {
    // prefix variant
    property color serFromColor: "#0000FF"
    property color serToColor: "#000000"
    // suffix variant
    property color fromcolor_: "#0000FF"
    property color tocolor_: "#000000"
}

接尾辞バリアントの場合、シリアライゼーションは次のようになります。

QDataStream stream;
const QMetaObject *metaObject = object->metaObject();
int count = metaObject->propertyCount();
// You can start iterating from metaObject->propertyOffset() if you
// are not interested in properties of parent objects.
for (int i=0; i<count; ++i)
{
    QMetaProperty property = metaObject->property(i);
    const char *name = property.name();
    const QString sName = QString::fromLatin1(name);
    if (! sName.endsWith(QStringLiteral("_"))) continue;
    QVariant value = object->property(name);
    stream << sName << value;    
    qDebug() << name << value;
}

プレフィックス バリアントについては、次の 3 つの条件を確認する必要があります。

  1. 名前が 3 文字を超えています。
  2. 名前は「ser」で始まります。
  3. name[3] が文字の場合、大文字でなければなりません。
于 2013-09-10T13:12:05.247 に答える