首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自不同动态库的Qt MetaObject继承检查

来自不同动态库的Qt MetaObject继承检查
EN

Stack Overflow用户
提问于 2017-12-21 18:37:52
回答 1查看 406关注 0票数 2

我正在创建一组具有公共基类型的Qt插件。该应用程序加载一个插件,并对它提供的类进行分类,其基础是它所属的基本类型。

基本类型包含在静态库中,派生类型被构建到包含静态库的插件中,应用程序还链接到静态库。

简化后,如下所示:

静态库(通用)

代码语言:javascript
复制
class Base1 : public QObject {
    Q_OBJECT
};
// Qt moc code generation:
//    const QMetaObject Base1::staticMetaObject = {&QObject::staticMetaObject, /*etc*/};

class BasePlugin {
    public:
        virtual QObject* getObject()=0;
};

共享库(插件)

代码语言:javascript
复制
class Derived1 : public Base1 {
    Q_OBJECT
};
// Qt moc code generation:
//     const QMetaObject Derived1::staticMetaObject = {&Base1::staticMetaObject, /*etc*/};

class Derived1Plugin: public QObject, public BasePlugin {
    Q_OBJECT
    public:
        QObject* getObject() { return new Derived1; }
};

应用程序

代码语言:javascript
复制
// setup plugin loader, load plugin
QObject* pluginObj = plugin.instance();

qDebug() << qobject_cast<Base1*>(pluginObj);    // Displays 0x0
qDebug()
      << pluginObj->metaObject()->superClass()  // Displays two different 
      << &Base1::staticMetaObject;              // pointer addresses

经过一番研究后,本质上,Base1的元对象是Base1的静态数据成员,并被初始化了两次:一次在共享库中,一次在应用程序中。元对象Derived1::staticMetaObject在插件中初始化,指向在插件中初始化的Base1::staticMetaObject,应用程序中的名称Base1::staticMetaObject指向应用程序中初始化的元对象。MSVC和GCC都是如此。因此,Qt决定来自插件的派生类与来自应用程序的基类不兼容。

我的问题是:

  • 如何初始化多个可执行文件中的静态成员?
  • 有没有更好的方法来做我想做的事?
  • 如何才能让我的应用程序识别出Derived1继承了Base1
EN

回答 1

Stack Overflow用户

发布于 2018-04-26 13:50:57

通过使用接口接口宏,我得到了一种稍微复杂一些的工作方法。

关于扩展Qt应用程序的文档解释了这些宏的使用,但是并不是所有的插件机器都是动态强制转换工作所必需的。

代码语言:javascript
复制
class BaseInterface
{
public:
  virtual ~BaseInterface() {}
  virtual void foo() = 0;
};

Q_DECLARE_INTERFACE( BaseInterface, "org.example.BaseInterface" )

class Base1 : public QObject, public BaseInterface
{
   Q_OBJECT
   Q_INTERFACES( BaseInterface )
public:
   virtual void foo() override {}
};

现在您应该能够使用qobject_cast< BaseInterface* >(pluginObj)进行强制转换了。

理论上,您也可以将Base1本身定义为接口,并将Q_INTERFACES( Base1 )添加到Derived1的声明中,但我在尝试这样做时遇到了QTBUG-59460,而且这意味着继承Base1的每个类都必须记住添加该宏。

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

https://stackoverflow.com/questions/47930850

复制
相关文章

相似问题

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