我需要从 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
}