xml ファイルを読み取り、この xml からさまざまな qt コントロールを逆シリアル化するコードを作成しようとしています。QDomDocument を使用してこれを行っており、逆シリアル化メソッドから QLlist を取得したいと考えています。少し問題があります。テンプレート クラス (.h) ファイルのコードを次に示します。
QList<T*> deserialize(QIODevice *input)
{
QList<T*> objects = QList<T*>();
if(_deserializeObject(input, objects))
return objects;
}
bool _deserializeObjects(QIODevice* input, QList<QObject*>& list);
および逆シリアル化メソッドを使用した私の .cpp ファイル。ここでは、ファイルからコントロール タグを読み取ります。
bool Serializer::_deserializeObjects(QIODevice* input, QList<QObject *> &objects)
{
QDomDocument doc;
if (!doc.setContent(input))
return false;
QDomElement root= doc.documentElement();
for(int j = 0; j < root.childNodes().length();j++)
{
QObject* object;
qDebug() << root.tagName();
if(root.tagName().contains("QGroupBox")) // <------- Here i need to determine which control i need to process.
{
????
}
qDebug () << object->metaObject()->className();
qDebug() << object->metaObject()->propertyCount();
for(int i = 0; i < object->metaObject()->propertyCount(); i++)
{
object->metaObject()->cast()
QMetaProperty prop = object->metaObject()->property(i);
QString propName = prop.name();
if(propName == "objectName")
continue;
QDomNodeList nodeList = root.elementsByTagName(propName);
if(nodeList.length() < 1)
continue;
QDomNode node = nodeList.at(0);
QVariant value = object->property(propName.toLatin1().data());
QString v = node.toElement().text();
if(propName == "x")
{
x = v.toInt();
}
else if(propName == "y")
{
y = v.toInt();
}
else if(propName == "width")
{
width = v.toInt();
}
else if(propName == "height")
{
height = v.toInt();
}
if(propName == "geometry")
{
continue;
}
object->setProperty(propName.toLatin1().data(), QVariant(v));
}
object->setProperty("geometry",QVariant(QRect(x,y,width,height)));
objects.push_back(object);
}
return true;
}
この部分では
if(root.tagName().contains("QGroupBox")) // <------- Here i need to determine which control i need to process.
{
????
}
qDebug () << object->metaObject()->className();
qDebug() << object->metaObject()->propertyCount();
for(int i = 0; i < object->metaObject()->propertyCount(); i++)
{
...
}
実際にどうにかしてコントロールのタイプを名前で取得したいので、問題は、QGroupBox プロパティを保存して QGroupBox を QObject にキャストできるので、QObject メタオブジェクト クラス名が QGroupBox になるので、このすべてのプロパティを渡すことができるかということです。コントロールの種類ごとにループを作りたくないからです。また、次のような結果が得られたとき:
QList<QObject *> ds = s.deserialize<Object>((QIODevice*)&f);
次に、すべての QObject をループで渡し、QMetaObject クラス名を使用し、qobject_cast を使用して各オブジェクトを QPushButton、QLabel などにキャストできますか?