Qt一步一步实现插件调用(附源码)、Qt一步一步实现插件通信(附源码)

来源:互联网 发布:flash软件的利弊 编辑:程序博客网 时间:2024/06/05 09:20

Qt一步一步实现插件调用(附源码)

最近手里几个项目都采用插件的方式进行开发工作,这里记录一下实现方法,给需要的同学一个参考,

在linux系统和window系统都能成功编译通过,不废话直接步骤

第一步:建立插件原型

新建一个Qt项目,实现一个一个实时刷新当前时间这这么一个功能,工程命名为testdemo

如图

效果图


代码

mainwidget::mainwidget(QWidget *parent) :     QWidget(parent),     ui(new Ui::mainwidget) {     ui->setupUi(this);     QTimer *timer = new QTimer(this);     //新建定时器     connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));     //关联定时器计满信号和相应的槽函数     timer->start(1000); } void mainwidget::timerUpDate() {     QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间     QString str = time.toString("yyyy-MM-dd hh:mm:ss ddd"); //设置显示格式     QString strr= strr.fromLocal8Bit("当前时间:")+str;//调用中文显示     ui->label->setText(strr); } 

第二步:生成插件文件

window下一般是dll后缀,linux下一般是so后缀

这里需要细说下直接上操作图片

1)这里选择Other Project 里面Qt Custom Designer Widget, 工程命名为testplugin

2)把第一步插件模型的文件附加到这个生成插件的工程中

3)找到testpluginPlugin.cpp文件下修改

QWidget*testpluginPlugin::createWidget(QWidget*parent) { //returnnewtestplugin(parent);//原来代码 returnnewmainwidget(parent);//修改后代码 } 

效果图

在生成目录下就能找到生成的插件testpluginplugin.dll。

第三步 主程序调用插件

同样的新建一个主程序工程,命名为testmain

效果图

代码

//加载插件函数 QWidget *loadPlugins(QString pluginFileName, QWidget *parent) {     QPluginLoader loader( pluginFileName );       bool b = loader.load();     if(b)         qDebug("loder ok!\r\n");     else        qDebug("loder error!\r\n");       QObject *plugin = loader.instance();     if (plugin)     {         QDesignerCustomWidgetInterface *iCustomWidgetInterface = qobject_cast<QDesignerCustomWidgetInterface *>(plugin);         if( iCustomWidgetInterface ){             QWidget *widget = iCustomWidgetInterface->createWidget( parent );             return widget;         }     }     else        qDebug("loader.instance() error\r\n");       return NULL; } //初始化插件 void MainWindow::loadplugin() {     QString DirPath=QApplication::applicationDirPath();     DirPath=DirPath.left(DirPath.lastIndexOf("/"));     QString pluginfilename;     pluginfilename = DirPath+"/testpluginplugin.dll";     testwidget = loadPlugins( pluginfilename, this ); }

这样一个完整的插件系统就实现了。

源码下载链接http://download.csdn.net/detail/huangyuancao/6653667


Qt一步一步实现插件通信(附源码)

 

前一章已经实现了主程序调用加载插件功能,这一章描述主程序和插件间通信功能

说道Qt的通信必须要了解信号和槽的机制原理,这里不做论述,不清楚的同学去看看信号和槽机制

不废话直接上步骤,在上一章的基础下进行修改

第一步:在插件中定义一个接收槽

#include "mainwidget.h" #include "ui_mainwidget.h" #include "qtimer.h" #include "qdatetime.h" mainwidget::mainwidget(QWidget *parent) :     QWidget(parent),     ui(new Ui::mainwidget) {     ui->setupUi(this);     timer = new QTimer(this);     //新建定时器     connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));     //关联定时器计满信号和相应的槽函数     timer->start(1000); }   mainwidget::~mainwidget() {     delete ui; } void mainwidget::timerUpDate() {     QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间     QString str = time.toString("yyyy-MM-dd hh:mm:ss ddd"); //设置显示格式     QString strr= strr.fromLocal8Bit("当前时间:")+str;//调用中文显示     ui->label->setText(strr); }   void mainwidget::time_start() {     timer->start();     ui->label->setText("start"); } void mainwidget::time_stop() {     timer->stop();     ui->label->setText("stop"); } 

第二步 生成插件

这一步和上一章内容不变,替换要实现的插件的内容即可

点击运行生成插件,找到插件testpluginplugin.dll

复制粘贴到主程序的程序运行目录下

第三步 主程序加载插件并设置信号槽

connect(ui->action,SIGNAL(triggered()), testwidget,SLOT(time_start())); connect(ui->action_2,SIGNAL(triggered()),testwidget,SLOT(time_stop())); 

效果图:

1)加载插件成功后默认时间是不断刷新

2)点击停止后时间显示stop

3)点击开始,时间继续刷新

这里就完成了主界面操作插件的功能

 源码下载http://download.csdn.net/detail/huangyuancao/6654197

作者:江南烟雨居
出处:http://www.cnblogs.com/newstart//
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
1 0