本文共 4566 字,大约阅读时间需要 15 分钟。
QT有着独特的插件管理方法便于使用,调理清晰.完全可以替代WIN32下的动态库,静态库.不过,QT也支持动态库和静态库加载.见QLibrary,最终,QLibrary调用WIN32下的LoadLibrary,GetProcAddress函数.
Qt插件的使用方法:
[1]project_main_1工程中定义接口
[2]project_plugin_1工程中实现接口
[3]project_main_1中使用QPluginLoader,QPluginLoader内部实现也是使用LoadLibrary,GetProcAddress,稍后会有说明
用法1:
用法2:

QpluginLoader pl(“plugin path”);

Qobject* plugin = pl.instance();
这里可以看出,充分的使用了对象对象的多态.那么,是 QpluginLoader是如何实现的呢?
看下面细节.
Qt的类几乎所有的都有一个QT_class+private的类,用来实现具体逻辑,暴露给我们的类定义通用的接口.QpluginLoader的内部类是QLibraryPrivate,与QLibrary是同一个.
[1]如何加载
[2] qt_plugin_instance是定义导出的呢?
在实现接口时,必须加上Q_EXPORT_PLUGIN2,Q_EXPORT_PLUGIN2 ( PluginName, ClassName )
宏定义:

# define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS) \

Q_PLUGIN_VERIFICATION_DATA \

Q_EXTERN_C Q_DECL_EXPORT \
const
char * Q_STANDARD_CALL qt_plugin_query_verification_data() \
{ return qt_plugin_verification_data; } \

Q_EXTERN_C Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) * Q_STANDARD_CALL qt_plugin_instance() \

Q_PLUGIN_INSTANCE(PLUGINCLASS)

其中

# define Q_PLUGIN_VERIFICATION_DATA \
static
const
char *qt_plugin_verification_data = \

"pattern=""QT_PLUGIN_VERIFICATION_DATA""\n" \

"version="QT_VERSION_STR"\n" \

"debug="QPLUGIN_DEBUG_STR"\n" \

"buildkey="QT_BUILD_KEY;
#define Q_EXTERN_C extern
#define Q_DECL_EXPORT __declspec(dllexport)
#define Q_PLUGIN_INSTANCE(IMPLEMENTATION) \
{ \
static QT_PREPEND_NAMESPACE(QPointer)<QT_PREPEND_NAMESPACE(QObject)> _instance; \
if (!_instance) \
_instance = new IMPLEMENTATION; \
return _instance; \
}
[3] instance是typedef QObject *(*QtPluginInstanceFunction)();
这样就实现了QT的插件.但是还没完.
在定义接口时,还应加上Q_DECLARE_INTERFACE,This macro associates the given Identifier (a string literal) to the interface class called ClassName. The Identifier must be unique.

# define Q_DECLARE_INTERFACE(IFace, IId) \

template <> inline
const
char *qobject_interface_iid<IFace *>() \
{ return IId; } \

template <> inline IFace *qobject_cast<IFace *>(QObject *
object) \
{ return reinterpret_cast<IFace *>((object ? object->qt_metacast(IId) : 0)); } \

template <> inline IFace *qobject_cast<IFace *>(
const QObject *
object) \
{ return reinterpret_cast<IFace *>((object ? const_cast<QObject *>(object)->qt_metacast(IId) : 0)); }
#endif
//
Q_MOC_RUN
转载地址:https://blog.csdn.net/lclflash/article/details/8856751 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!