首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt QMetaObjects和从QWidget到QObject的转换

Qt QMetaObjects和从QWidget到QObject的转换
EN

Stack Overflow用户
提问于 2013-08-21 22:46:48
回答 2查看 2.4K关注 0票数 0

我遇到了一些麻烦,下面是模板类(.h)文件的一些代码:

代码语言:javascript
复制
 QList<T*> deserialize(QIODevice *input)
 {

        QList<T*> objects = QList<T*>();


        if(_deserializeObject(input, objects)) 
            return objects;

    }
    bool _deserializeObjects(QIODevice* input, QList<QObject*>& list);

和我的带有反序列化方法的.cpp文件,在这里我从文件中读取控制标签:

代码语言:javascript
复制
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;
}

在这一部分

代码语言:javascript
复制
  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转换为QObject保存QGroupBox属性,以便QObject metaObject类名称为QGroupBox,这样我就可以传递所有这些属性?因为我不想为每个控件类型创建循环。当我得到结果时我也是这样的:

代码语言:javascript
复制
     QList<QObject *> ds = s.deserialize<Object>((QIODevice*)&f);

然后,我是否可以在一个循环中传递所有的QObjects,并使用QMetaObject类名和qobject_cast将每个对象转换为QPushButton、QLabel等?

EN

回答 2

Stack Overflow用户

发布于 2013-08-21 23:28:28

QGroupBox是QObject的子类;因此每个QGroupBox也是一个QObject,所以您可以随时将其视为一个。显式类型转换不是必需的。

迭代循环中所有派生自QObject的不同对象将做您想要的事情,前提是您对它们调用的方法是虚方法(假设它们是虚方法--具体地说,QObject::metaObject()是一个虚方法,所以您的循环将返回适当的QMetaObject,即使它是通过QObject指针调用它们的方法)。

(顺便说一句,这个过程中最烦人的部分可能是从XML中读取对象类型的名称,然后需要实例化该类型的对象。AFAIK在C++中没有很好的自动方法来做到这一点,所以你能做的最好的事情是一个工厂函数,它包含一个巨大的switch语句,对于你想实例化的每个类型都有一个单独的case。)

票数 1
EN

Stack Overflow用户

发布于 2013-08-22 00:46:42

或者,为正确的工作使用正确的工具。很可能你在这里真正构建的是一些用于定义窗口小部件布局等的XML东西。Qt已经有了一个这样的工具:Qt Designer,它使用XML format进行UI定义,并使用C++ code generator在编译时实际生成C++代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18360635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档