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
}