【问题标题】:How can I find a Qt metaobject instance from a class name?如何从类名中找到 Qt 元对象实例?
【发布时间】:2011-01-30 21:49:04
【问题描述】:

在给定类名的情况下,有没有办法找到一个类的 QMetaObject 实例?我喜欢做的是从磁盘加载对象,但要做到这一点,我需要一种使用类名检索 QMetaObject 实例的方法,以便使用 QMetaObject 创建实例。

【问题讨论】:

    标签: qt reflection metadata classname qmetaobject


    【解决方案1】:

    您可以将您需要的 MetaClass 实例存储在 Hash 或 Map 中,然后通过您将它们存储在下面的任何名称检索它们

    【讨论】:

      【解决方案2】:

      对于您的情况,适当的解决方案可以使用 Qt 插件机制。它提供了轻松加载共享/动态库并检查它是否包含某些所需接口的实现的功能,如果是,则创建实例。详情可以在这里找到:How to Create Qt Plugins

      【讨论】:

        【解决方案3】:

        您应该可以使用QMetaType 执行此操作。你可能需要Q_DECLARE_META_TYPE() 和/或qRegisterMetaType() 来让你知道你的类型。然后它应该大致像链接中的这个例子一样工作:

         int id = QMetaType::type("MyClass");
         if (id == 0) {
             void *myClassPtr = QMetaType::construct(id);
             ...
             QMetaType::destroy(id, myClassPtr);
             myClassPtr = 0;
         }
        

        【讨论】:

          【解决方案4】:

          我最近也遇到了同样的问题。我需要元对象,而不必创建类本身的实例。我能做的最好的事情是创建一个全局/静态函数来检索给定类名的 qmetaobject。我通过使用 QObject::staticMetaObject 实现了这一点。

          QMetaObject GetMetaObjectByClassName(QString strClassName)
          {
              QMetaObject metaObj;
              if (strClassName.compare("MyClass1") == 0)
              {
                  metaObj = MyClass1::staticMetaObject;
              }
              else if (strClassName.compare("MyClass2") == 0)
              {
                  metaObj = MyClass2::staticMetaObject;
              }
              else if (strClassName.compare("MyClass3") == 0)
              {
                  metaObj = MyClass3::staticMetaObject;
              }
              else if (strClassName.compare("MyClass4") == 0)
              {
                  metaObj = MyClass4::staticMetaObject;
              }
              else if (strClassName.compare("MyClass5") == 0)
              {
                  metaObj = MyClass5::staticMetaObject;
              }
          
              // and so on, you get the idea ...
          
              return metaObj;
          }
          

          见:http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var

          如果有人有更好的选择,请分享!

          【讨论】:

            【解决方案5】:

            你也可以看看函数:QMetaType::metaObjectForTypewhich

            为类型返回 QMetaType::metaObject

            更新:这是我的代码,它通过类名创建一个类。 (注意这个类必须用qRegisterMetaType注册(或者是QObject base)

            int typeId = QMetaType::type("MyClassName");
            const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
            QObject *o = metaObject->newInstance();
            MyClassName *myObj = qobject_cast<MyClassName*>(o);
            

            更新 2:我忘了说。你的类的构造函数必须标记为 Q_INVOKABLE

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-02-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多