0

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 などにキャストできますか?

4

2 に答える 2

0

または、適切な仕事には適切なツールを使用してください。ここで実際に構築しているのは、ウィジェットのレイアウトなどを定義するための XML のものである可能性があります。Qt には、そのためのツールが既にあります。UI 定義にXML 形式を使用するQt Designerと、実際にC++ コードを生成するための C++コード ジェネレーターです。コンパイル時。

于 2013-08-21T16:46:41.910 に答える