QMetaObject
クラスから入手できる実行時の型情報を見てみるとよいでしょう。データオブジェクトはQObject
の子孫で、QOBJECT
マクロが宣言されている必要があります。また、データオブジェクトのプロパティを反復し、対応するエディタのプロパティを作成して設定する単純なルーチンが必要になります。 Metaオブジェクトは、値とメソッドの呼び出しをリセットするためのインタフェースも提供しています。 Qtプロパティシステムの詳細は、The Property Systemです。以下は、この操作を行う可能性がどのように小さな例です。
プロパティブラウザや管理者の宣言と初期化:
QtTreePropertyBrowser *_browser;
QtIntPropertyManager *_intManager;
QtDoublePropertyManager *_doubleManager;
QtStringPropertyManager *_stringManager;
_intManager = new QtIntPropertyManager();
_doubleManager = new QtDoublePropertyManager();
_stringManager = new QtStringPropertyManager();
_browser = new QtTreePropertyBrowser(ui->centralWidget);
負荷のプロパティ名と値:QtPropertyBrowser
のサンプルフォルダに
void loadProperties(QObject *object)
{
_browser->clear();
if (object)
{
const QMetaObject *meta = object->metaObject();
qDebug() << "class : " << meta->className();
for (int i=0; i<meta->propertyCount(); i++)
{
QMetaProperty metaProperty = meta->property(i);
QVariant value = metaProperty.read(object);
QtProperty *property = NULL;
qDebug() << "property : " << metaProperty.name() << " : " << value.toInt();
if (metaProperty.type() == QVariant::Int)
{
property = _intManager->addProperty(metaProperty.name());
_intManager->setValue(property, value.toInt());
}
else if (metaProperty.type() == QVariant::Double)
{
property = _doubleManager->addProperty(metaProperty.name());
_doubleManager->setValue(property, value.toDouble());
}
else if (metaProperty.type() == QVariant::String)
{
property = _stringManager->addProperty(metaProperty.name());
_stringManager->setValue(property, value.toString());
}
if (property)
_browser->addProperty(property);
}
}
}
これは確かに便利な例ですが、シンプルでしかも強力です。 +1 – hurikhan77