目录
闲谈
插件经常听说,但是关于制造一个插件,如何制造,如何使用便是要解决的。但是,在这之前,就为什么使用插件说说我的见解。说实话,自己还百科下,大致理解解耦等意思,代价是,没事找事(因为功能完全可以实现,而且,可选的路子也挺多),回报是,新的事务。当然这样的理解着实搞笑,权当在此记录相关。
一步一步
- 插件接口的定义:其实就是一个抽象对象,Q_DECLARE_INTERFACE(className, strID)
// 测试工程的插件接口
class CusInterFace
{
public:
virtual ~CusInterFace(){}
virtual void sayHello(QString info) = 0 ;
};
#define CusInterFace_iid "My.Examples.Plugin.CusInterFace"
Q_DECLARE_INTERFACE(CusInterFace, CusInterFace_iid)
- 插件的实现:具体对象的实现,而且继承QObject优先;Q_INTERFACES(abstractClass);Q_PLUGIN_METADATA(IID strID FILE);pro文件配置:TEMPLATE = lib ,CONFIG += plugin
// 插件工程,目标是库
class PlugDetail:public QObject,public CusInterFace
{
Q_OBJECT
Q_INTERFACES(CusInterFace)
Q_PLUGIN_METADATA(IID CusInterFace_iid)
public:
PlugDetail();
~PlugDetail();
void sayHello(QString info);
};
// pro file
TEMPLATE = lib
CONFIG += plugin
- 插件的使用:
QString pluginsDir = "..../插件工程.dll";
QPluginLoader pluginLoader(pluginsDir);
QObject *plugin = pluginLoader.instance();
if (plugin)
{
//插件名称
QString pluginName = plugin->metaObject()->className();
//对插件初始化
if(pluginName == "PlugDetail") // 具体插件
{
m_pInterFace = qobject_cast<CusInterFace *>(plugin);
if (m_pInterFace)
{
m_pInterFace->sayHello("i get !!!! ");
}
}
}
回首
以上的,接口是我们自定义的,当然Qt为我们提供了诸多便利的接口层,eg:QDesignerCustomWidgetInterface,这样我们只用在完成后两步即可;还有一些高级api。其中,涉及的这三个宏和QPluginLoader 尤为重要了。