当前位置: 首页 > news >正文

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

 

 

 

相关文章:

  • 如何提高Linux下块设备IO的整体性能?
  • 演示:取证分析IPV6组播地址与MAC地址的映射关系
  • 类的运用(一)
  • ODI中通过配置表和自定义逆向工程获取数据库信息
  • vim的Tab键
  • js prototype之诡异
  • 仿博彩业的转盘功能演示
  • 混合敏捷研发(一)SpecDD:混合的敏捷方法
  • 如何在Android模拟器上安装apk文件
  • 【转】iOS 宏(define)与常量(const)的正确使用-- 不错
  • 程序自动生成Dump文件
  • Python:urllib 和urllib2之间的区别
  • 华为实习日记——第十二天
  • Js 读写cookies
  • ExpandableListView(可展开的列表组件)的说明以及其用法
  • axios 和 cookie 的那些事
  • CSS 三角实现
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Fastjson的基本使用方法大全
  • Java小白进阶笔记(3)-初级面向对象
  • js写一个简单的选项卡
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • WePY 在小程序性能调优上做出的探究
  • yii2权限控制rbac之rule详细讲解
  • 从零开始学习部署
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 汉诺塔算法
  • 力扣(LeetCode)965
  • 每天一个设计模式之命令模式
  • 双管齐下,VMware的容器新战略
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # include “ “ 和 # include < >两者的区别
  • #100天计划# 2013年9月29日
  • #1015 : KMP算法
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)http-server应用
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET Standard 的管理策略
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET4.0并行计算技术基础(1)
  • .Net语言中的StringBuilder:入门到精通
  • /proc/vmstat 详解
  • @staticmethod和@classmethod的作用与区别
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ C++ ] STL---stack与queue
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • []常用AT命令解释()
  • [2544]最短路 (两种算法)(HDU)
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [bzoj1912]异象石(set)
  • [BZOJ3757] 苹果树