Qt生成插件和主程序中加载插件

来源:互联网 发布:美即和一叶子知乎 编辑:程序博客网 时间:2024/05/16 01:09

1.新建一工程,插件类,继承接口类。 注:Qt不同版本生成插件的方式不一致,比如目前4.8生成插件的方法,在最新Qt 5.0上不生效,有报错信息。但是Qt 4版本的应该都没问题,Qt 5.0有些变化,
.pro文件内容为下

#-------------------------------------------------## Project created by QtCreator 2013-01-24T09:25:40##-------------------------------------------------QT       += coreQT       -= guiTARGET = pluginsTestCONFIG   += consoleCONFIG   += plugin# lib 编译生成动态插件 主程序运行时动态加载TEMPLATE = libINCLUDEPATH += ../SOURCES += plugin.cppHEADERS += \    plugin.h \    PluginInterface.h


PluginInterface.h

#include <QObject>//纯虚类class PluginInterface{public:    virtual ~PluginInterface(){}    virtual int getContact( int v ) = 0;//在主程序定义一个共同的接口,该接口直接和插件交流};QT_BEGIN_NAMESPACE//告诉Q meta-object system 接口名称Q_DECLARE_INTERFACE(PluginInterface,"com.chenbo.myTest.PluginInterface/1.0")QT_END_NAMESPACE


plugin.h

#ifndef PLUGIN_H#define PLUGIN_H#include <QObject>#include <QtPlugin>#include <QtGlobal>//包含接口类的头文件#include "PluginInterface.h"//编写插件//1.1 声明插件类 继承自PluginInterface和QObjectclass Plugin: public QObject,public PluginInterface{    Q_OBJECT    //1.2告诉Qt的moc系统,将使用PluginInterface这个接口    //Q_DECLARE_INTERFACE声明过的接口    Q_INTERFACES( PluginInterface )public:    Plugin(QObject *parent = NULL);    int getContact(int v); //1.3实现该接口};#endif // PLUGIN_H


plugin.cpp

#include "plugin.h"#include <QDebug>Plugin::Plugin(QObject *parent)    :QObject(parent){}int Plugin::getContact(int v){    qDebug() << "first:" << v;    v += 10;    qDebug() << "after:" << v;    return v;}QT_BEGIN_NAMESPACE//输出插件//这个宏是让Qt知道myPlugin是一个插件,第一个参数是插件的名字,第二个参数是库的名字(ClassName),所有二者经常相同。Q_EXPORT_PLUGIN2(myPlugin,Plugin)QT_END_NAMESPACE


编译后生成pluginsTest.dll,第一步工作完成,下面将介绍如何在主程序中动态加载该插件
新建一工程,.pro文件如下

#-------------------------------------------------## Project created by QtCreator 2013-01-24T10:07:47##-------------------------------------------------QT       += coreQT       -= guiTARGET = runPluginCONFIG   += consoleCONFIG   -= app_bundleTEMPLATE = appINCLUDEPATH += D:/testDemo/runPluginLIBS += -L -lpluginsTest#LIBS += -L. -lpluginsTestSOURCES += main.cpp


加载动态库

#include <QtCore/QCoreApplication>#include <QDir>#include <QtPlugin>#include <QPluginLoader>#include "plugin.h"#include <QDebug>int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    //主程序动态加载插件    //1.1 指定路径搜索插件    QDir pluginsDir(qApp->applicationDirPath());    qDebug()<< pluginsDir;    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));        //1.2 检测并加载插件        QObject *plugin = pluginLoader.instance();        if(plugin)        {            //1.3 测试插件是否有效 使用qobject_cast 测试插件是否给出了相应接口并进行类型转换,转换成接口对象指针            PluginInterface *interface = qobject_cast<PluginInterface*>(plugin);            if(interface)            {                //getContact(int)是PluginInterface的一个成员函数
                interface->getContact(100);            }        }    }    return a.exec();}

输出结果为:
first: 100
after: 110 加载成功。