QT MetaObject从单独的动态库进行检查
Qt MetaObject inheritance checking from separate dynamic libraries
我正在创建一组具有常见基本类型的QT插件。该应用程序加载一个插件并根据其是哪个基本类型的孩子进行分类。
。基本类型包含在静态库中,派生类型内置在插件中,包括静态库,并且该应用程序还链接到静态库。
。简化,这看起来像:
静态库(common)
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
的静态数据成员,并且两次初始化:一次在共享库中,一次在应用程序中。MetaObject Derived1::staticMetaObject
在插件中初始化了,并指向插件中初始化的Base1::staticMetaObject
,并且在应用程序中,App中的名称Base1::staticMetaObject
指向APP中初始化的MetaObject。MSVC和GCC都是如此。因此,QT确定插件的派生类与应用程序的基类不兼容。
我的问题是:
- 如何在多个可执行文件中包含静态成员?
- 有更好的方法可以做我试图做的事情吗?
- 如何让我的应用识别
Derived1
继承Base1
?
我通过使用q_declare_interface和q_interfaces宏。
扩展QT应用程序的文档说明了这些宏的使用,但并非所有插件机械对于动态铸件都必须使用。
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
都必须记住要记住添加该宏。
相关文章:
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 如何进行程序执行检查
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- C++使用宏进行动态实例化
- 运行时检查失败 #2 MSVC 仅使用 utf8proc 进行调试
- 使用列表进行动态结构分配
- C++:检查动态取消分配是否正常工作
- 检查向量是否使用除法和阻抗算法进行排序
- 将glteximage2d保存到文件系统中进行检查
- QT MetaObject从单独的动态库进行检查
- 嵌入的Linux PPC32动态内存检查工具
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- VS2010中的浮点内省-如何在不中断的情况下进行检查
- 如何使用谷歌测试零或一个函数调用进行检查
- 困于让占用率随着输入而变化,并根据容量进行检查
- 生成文件:更改工作目录以进行检查
- 在O(nlog(n))时间内对该条件进行C++检查
- 如果系统处于活动状态,如何在C++中进行检查
- 在数组中的两个点之间进行检查
- 自定义迭代器包装另一个迭代器:迭代到底层的end迭代器而不进行检查