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 加载成功。
- Qt生成插件和主程序中加载插件
- 在Qt中如何编写插件,加载插件和卸载插件。
- 在Qt中如何编写插件,加载插件和卸载插件
- 在Qt中如何编写插件,加载插件和卸载插件
- 在Qt中如何编写插件,加载插件和卸载插件
- 在Qt中如何编写插件,加载插件和卸载插件(转)
- Qt中如何 编写插件 加载插件 卸载插件
- Qt中如何 编写插件 加载插件 卸载插件
- W3CSchool中加载QT插件问题
- Jack's Notes7——反射案例(主程序加载插件)
- 自定义的插件如何加载到Qt Designer中
- 如何在MeeGo Qt应用程序中加载插件(一)
- 如何在MeeGo Qt应用程序中加载插件(二)
- 如何在MeeGo Qt应用程序中加载插件(二)
- 如何在MeeGo Qt应用程序中加载插件(一)
- Qt Designer中加载第三方插件Qwt
- QT中插件分析
- c#插件式程序开发(二):如何在插件中调用主程序资源
- multimap 使用方法
- [LeetCode] Gray Code
- WinCE 字体平滑 ClearType
- 最近的一点点小心得
- 教你改变const变量的值
- Qt生成插件和主程序中加载插件
- Android回调方法示例
- IOCP理解
- 什么是地理信息系统(GIS)?
- nginx+tomcat+redis 负载均衡规划
- 栈
- FreeBSD 命令自动补全
- 输入法(IME)实现原理
- Nginx+Tomcat实现动静分离