gpt4 book ai didi

c++ - Qt MetaObject 从单独的动态库继承检查

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:03 24 4
gpt4 key购买 nike

我正在创建一组具有通用基本类型的 Qt 插件。该应用程序加载一个插件并根据它是哪个基类型的子类对其提供的类进行分类。

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

简化后,这看起来像:

静态库(常用)

class Base1 : public QObject {
Q_OBJECT
};
// Qt moc code generation:
// const QMetaObject Base1::staticMetaObject = {&QObject::staticMetaObject, /*etc*/};

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

共享库(插件)

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; }
};

申请

// 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< app中的指向app中初始化的元对象。 MSVC 和 GCC 都是如此。因此,Qt 决定插件的派生类与应用程序的基类不兼容。

我的问题是:

  • 如何初始化包含在多个可执行文件中的静态成员?
  • 有没有更好的方法来完成我正在尝试做的事情?
  • 如何让我的应用识别 Derived1 继承 Base1

最佳答案

我通过使用 Q_DECLARE_INTERFACE 获得了一种稍微复杂的工作方法和 Q_INTERFACES宏。

关于 Extending Qt Applications 的文档解释了这些宏的使用,但并不是所有的插件机制都是动态转换工作所必需的。

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本身作为接口(interface),并添加 Q_INTERFACES( Base1 )Derived1的声明,但我遇到了 QTBUG-59460尝试这样做时,这意味着每个类都继承 Base1必须记得添加那个宏。

关于c++ - Qt MetaObject 从单独的动态库继承检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com