QT插件开发方式(没看懂)

创建一个QT的库项目,删除自动生成的.h和.cpp文件,添加一个接口定义.h文件和一个接口实现类(一个.h一个.cpp).代码如下:

1.接口文件源码

#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H

#include <QString>

class EchoInterface
{
public:
 virtual ~EchoInterface() {}
 virtual QString echo(const QString &message) = 0;
};

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(EchoInterface, "com.hollysys.plugin.EchoIntrface/1.0");
QT_END_NAMESPACE

#endif

2.接口实现类头文件

#ifndef PLUGIN_H
#define PLUGIN_H

//#include "plugin_global.h"
#include <QObject>
#include "plugininterface.h"

class Plugin : public QObject, EchoInterface
{
 Q_OBJECT
 Q_INTERFACES(EchoInterface)
public:
 Plugin();
 ~Plugin();
public:
 QString echo(const QString &message);

};

#endif // PLUGIN_H

3.接口实现类cpp文件

#include "plugin.h"
#include <QtGui>

Plugin::Plugin()
{

}

Plugin::~Plugin()
{

}

QString Plugin::echo(const QString &message)
{
 return message;
}

Q_EXPORT_PLUGIN2("echoPlugin", Plugin);

编译生成dll格式的插件.这里可能会遇到LNK2001错误,因为插件接口定义依赖于QT的元数据,而在代码中手动添加Q_OBJECT宏后,编译器不会自动为我们生成moc_XXXX.cpp文件,因此需要使用命令行生成moc元数据文件:cmd-->cd 源码所在命令 -->moc -o moc_XXXX.cpp XXXX.h.这样就可以手动创建出moc元数据文件,解决LNK2001编译错误.

建立一个GUI测试项目,代码如下:

#include "test.h"
#include <QtGui>
#include <QMessageBox>
#include <QDir>

Test::Test(QWidget *parent, Qt::WFlags flags)
 : QMainWindow(parent, flags)
{
 ui.setupUi(this);
 QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(ButtonClicked()));
 loadPlugin();
}

Test::~Test()
{

}

bool Test::loadPlugin()
{
 QDir pluginsDir(qApp->applicationDirPath());
 foreach (QString filename, pluginsDir.entryList(QDir::Files))
 {
  QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(filename));
  QObject *plugin = pluginLoader.instance();
  if(plugin)
  {
   echoInterface = qobject_cast<EchoInterface *>(plugin);//echoInterface是成员变量
   if(echoInterface)
    return true;
  }
 }
}

void Test::ButtonClicked()
{
 QString plugin = ui.lineEdit->text();
 QMessageBox::information(NULL, "", echoInterface->echo(plugin));
}

分析代码可见,这里对所有与exe文件同目录的文件尝试加载插件,如果加载成功则返回.代码实现非常简洁.在正式开发中可将已加载的插件接口存放在列表中,在需要的时候依次调用即可.

另外如果想获取插件中类定义的元数据,可以使插件接口类从QObject继承,并使用Q_CLASSINFO宏添加键值对,如Q_CLASSINFO("Author**", "Henreash**").并从主程序中使用插件对象元数据获取这些键值对:

const QMetaObject *mo = echoInterface->metaObject();
 for(int i = 0; i < mo->classInfoCount(); i++)
 {
  qDebug() << mo->classInfo(i).name() << mo->classInfo(i).value();
 }

使用这个机制可以在定义插件类的时候向主程序传递一些特殊信息.

测试发现,如果在插件接口类中定义一个静态变量,那么这个静态变量在插件中的地址和在主程序中的地址是不相同的.

http://blog.csdn.net/henreash/article/details/7264489

时间: 2024-10-13 16:36:39

QT插件开发方式(没看懂)的相关文章

【Luogu】P2765魔术球问题(没看懂的乱搞)

题目链接 这题……讲道理我没看懂. 不过我看懂题解的代码是在干嘛了qwq 题解是zhaoyifan的题解 然后……我来讲讲这个题解好了. 题解把值为i的球拆成了两个,一个编号是i*2,一个编号是i*2+1. 为什么编号要这么编呢?因为统计编号的时候好统计qwq 然后从起点向i*2连一条边,从i*2+1到终点连一条边. 然后对于能够跟他凑成完全平方数的连边. 然后跑最大流,如果发现这个球不能串进原来的柱子上,也就是说最大流没有变化,那么就新加一条柱子. 当柱子数超过n的时候就退出循环开始统计. 大

QT插件开发方式(作者有RemOjbects文档翻译(48)篇)

创建一个QT的库项目,删除自动生成的.h和.cpp文件,添加一个接口定义.h文件和一个接口实现类(一个.h一个.cpp).代码如下: 1.接口文件源码 #ifndef PLUGININTERFACE_H#define PLUGININTERFACE_H #include <QString> class EchoInterface{public: virtual ~EchoInterface() {} virtual QString echo(const QString &message

面试之加分项vue(没看懂,。。。。)

对大部分人来说,掌握Vue.js基本的几个API后就已经能够正常地开发前端网站.但如果你想更加高效地使用Vue来开发,成为Vue.js大师,那下面我要传授的这五招你一定得认真学习一下了.在面试过程很多HR会问到. 第一招:化繁为简的Watch 场景还原: 组件创建的时候我们获取一次列表,同时监听input框,每当发生变化的时候重新获取一次筛选后的列表这个场景很常见,有没有办法优化一下呢? 招式解析: 首先,在watch中,可以直接使用函数的字面量名称:其次,声明immediate:true表示创

poj 1502 MPI Maelstrom Dijkstra算法的简单运用 ,呵呵,,我估计有很多人都没看懂什么意思,我也看了很久

MPI Maelstrom Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5831   Accepted: 3621 Description BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distributed shared memory machine with a hierarchic

关于this的例子解说:引用高级程序第三版中的代码 this在ECMA中介绍的比较复杂。很多我都没看懂。

想要了解THIs的值如何变化的要了解很多知识点.这里我就简单点介绍下this的值如何变化的. 10.1.6 活动对象 当控制进入函数代码的执行上下文时,创建一个活动对象并将它与该执行上下文相关联, 并使用一个名为 arguments.特征为 { DontDelete } 的属性初始化该对象.该属性的初始值是 稍后将要描述的一个参数对象. 接下来,这个活动对象将被用作变量初始化的可变对象. 活动对象纯粹是一种规范性机制,在 ECMAScript 访问它是不可能的.只能访问其成员而 非该活动对象本身

《大话西游》20年后重映(附影评:《大话西游》你真的看懂了吗?)

2014-10-25 02:43:24 来源: 北京日报(北京) 本报讯 (记者 周南焱)"电影里的台词差点儿都能背,但在影院里再看还是会笑.看到最后紫霞仙子死的时候.还是忍不住落泪! "昨天下午,经典老片<大话西游>在海航活力天宝影城又一次上映,一位重温影片的观众如是说.还有观众反映,用如今的电影技术水准来看,<大话西游>确实有点老土,但从内容来看还是那么亲切. 周星驰主演的<大话西游>20年前公映,当时票房大败. 但谁也没想到,该片通过盗版光碟和

小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代理真的非常简单,只不过就是实现一个 InvocationHandler 接口重写一下 invoke 方法而已.不错,其实很多看似 high level 的技术都并没有想象中的那么晦涩难懂,只要你肯下定决心去了解它,去认识它,去学习它你就会发现,原来都是可以学得懂的.本篇博文将介绍 DroidPlugin 框架

Eclipse添加Qt插件

此文件仅为步骤操作作一个记录,以便以后方便查阅. 1.操作大体参考这个网站:http://blog.csdn.net/defonds/article/details/5013412 2.我的运行环境:使用TQ210硬件开发平台,编译器是天嵌提供的4.4.6,Eclipse好像是我自己下载安装的,问题是现在要给Eclipse装Qt的插件. 3.去Qt网站上下载Qt的源码,Qt提供的Eclipse插件.妈蛋,这里弄错了几次.在上面的文章中,会有介绍说,根据自己的操作系统位数下载对应的Eclipse

Qt5的插件机制(4)--Qt插件的元信息metaData

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<