惯例就是坚持 - 介绍
插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序(来自百度百科)
QT插件(https://doc.qt.io/qt-5/plugins-howto.html)有继承QT提供的接口用以扩展QT即所谓的High_Level, 继承用户自定义接口用以扩展应用程序的Low_Level。大多数情况我们都是依据特定项目需求自定义接口实现插件式开发。QT的插件式操作流程是

考虑:[what]在使用qobject_cast转换为接口指针时,如果需要connect信号和槽该怎么操作?因为信号和槽必须为QObjcet,而接口是没有继承QObject的[打脸]。
定义接口头文件及插件头文件:
#define IID_ILOG "org.genggang.com.ilog"class ILog{public: virtual ~ILog() {} virtual void ShowLog(QString from, LOG_LEVEL level, QString info){}};Q_DECLARE_INTERFACE(ILog, IID_ILOG)
#include <QObject>#include <QtPlugin>#include <ILog.h>class LogManager : public QObject, public ILog{ Q_OBJECT Q_PLUGIN_METADATA(IID IID_ILOG) Q_INTERFACES(ILog)public: void ShowLog(QString from, LOG_LEVEL level, QString info);};
插件类中QObject必须在第一位置。实现各个方法,插件开发完成。
小Tip [得意] -> 编译动态库或静态库,只需要在.pro项目配置里删除或增加CONFIG += staticlib即可。
回到上面提到的问题,在qobject_cast转换为接口指针时,需要连接信号和槽该怎么处理?
既然接口实现类会继承QObject,我们可以在接口里定义个QObject,在实现类构造是将对象保存在接口里,因此上面的接口和实现稍微修改下:
#define IID_ILOG "org.genggang.com.ilog"class ILog{public: ILog(QObject parent):_object(parent){} virtual ~ILog() {} virtual void ShowLog(QString from, LOG_LEVEL level, QString info){} QObject object(){return _object;}signals://起不到任何左右,纯粹为了定义,当然也可以是slots virtual void signalsTest()=0;private: QObject _object;};Q_DECLARE_INTERFACE(ILog, IID_ILOG)
实现类在实现构造函数是如下:
LogManager::LogManager(QObject parent):ILog(this){.....}
在使用时就可以如下:
ILog instance = qobject_cast<ILog>(xxxxx);connect(instance->object(), SIGNAL(signalsTest()), this, SLOT(DoTest()));
插件开发基本介绍就先写到这吧,下一篇就来实际的插件开发应用之日记插件