博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt 一步一步实现dll调用(附源码)
阅读量:6336 次
发布时间:2019-06-22

本文共 3340 字,大约阅读时间需要 11 分钟。

前言:从上个月底因为新项目统一平台需要用Qt开发,就开始研究Qt,但是一直感觉没有入门,不知道为什么,很多功能实现了,但是知其然不知其所以然,就像现在设计的项目

使用插件进行开发,做软件开发大体都知道什么事插件式开发,以前c#也用过,但是Qt插件开发还是第一次,百度了很久终于实现,这里记录下!这里不讲原理直接讲过程,高手绕行。。。

第一部分

建立插件程序实现2个功能

(1)创建一个加法函数供主程序进行动态调用

(2)创建一个查询页面供主程序进行动态调用

第一步创建插件程序

打开文件菜单-》新建文件或项目-》选择other project -》C++库如图

点击Choose进入如图

 

选择共享库-》输入名称-》选择你工程位置

 

点击下一步选择工程需要模块点击下一步完成

完成后你会发现工程有2个头文件和一个源文件

这里点击新建文件添加一个新建文件

新建文件-》Qt-》Qt设计类-》选择dialog-》输入名称

如图

头文件

MYTESTDLL_GLOBAL_H

View Code

MYSHOWTEST_H

#ifndef MYSHOWTEST_H#define MYSHOWTEST_H#include 
namespace Ui { class MyShowTest;}class MyShowTest : public QDialog{ Q_OBJECTpublic: explicit MyShowTest(QWidget *parent = 0); ~MyShowTest();private: Ui::MyShowTest *ui;};#endif // MYSHOWTEST_H

MYTESTDLL_H

#ifndef MYTESTDLL_H#define MYTESTDLL_H#include "MyTestDll_global.h"#include "qdialog.h"class MYTESTDLLSHARED_EXPORT MyTestDll {public:    MyTestDll();};extern "C" Q_DECL_EXPORT int add(int a,int b);extern "C" Q_DECL_EXPORT QDialog *showDialog();#endif // MYTESTDLL_H

源文件

MyShowTest.cpp

#include "myshowtest.h"#include "ui_myshowtest.h"MyShowTest::MyShowTest(QWidget *parent) :    QDialog(parent),    ui(new Ui::MyShowTest){    ui->setupUi(this);}MyShowTest::~MyShowTest(){    delete ui;}

MyTestDll.cpp

#include "mytestdll.h"#include "MyShowTest.h"MyTestDll::MyTestDll(){}int add(int a,int b){  return a+b;}QDialog *showDialog(){    MyShowTest *ss=new MyShowTest();    return ss;}

ui

点击构建项目完成插件。

第二部分

新建一个主程序如图

把生成的插件mytestdll.dll放入mytest.exe相同目录

头文件

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include 
namespace Ui { class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); ~MainWindow();private: Ui::MainWindow *ui;private slots: void on_pushButton_2_clicked(); void on_pushButton_clicked();};#endif // MAINWINDOW_H

源文件

View Code
#include "mainwindow.h"#include "ui_mainwindow.h"#include "qlibrary.h"#include "qmessagebox.h"#include "string.h"MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);}MainWindow::~MainWindow(){    delete ui;}typedef int (*Fun)(int,int); //定义函数指针,以备调用void MainWindow::on_pushButton_clicked(){   QLibrary mylib("MyTestDll.dll");   //声明所用到的dll文件   int result;   QString sresult;   if (mylib.load())              //判断是否正确加载   {       Fun open=(Fun)mylib.resolve("add");    //援引 add() 函数       if (open)                  //是否成功连接上 add() 函数       {            int s1=this->ui->lineEdit->text().toInt();            int s2=this->ui->lineEdit_2->text().toInt();            result=open(s1,s2);      //这里函数指针调用dll中的 add() 函数            sresult=QString::number(result);            this->ui->lineEdit_3->setText(sresult);       }   }   else   {       QMessageBox::information(NULL,"NO","DLL is not loaded!");   }}typedef QDialog *(*Funs)(); //定义函数指针,以备调用void MainWindow::on_pushButton_2_clicked(){   //加载插件   QLibrary mylib("MyTestDll.dll");   //声明所用到的dll文件   if (mylib.load())              //判断是否正确加载   {       Funs open=(Funs)mylib.resolve("showDialog");    //援引 add() 函数       if (open)                  //是否成功连接上 add() 函数       {           QDialog *form1= open();           form1->show();        }    }}

效果如图

完成预定2个功能

源码下载:

本文转自夜&枫博客园博客,原文链接:http://www.cnblogs.com/newstart/archive/2013/01/23/2873611.html,如需转载请自行联系原作者

你可能感兴趣的文章
玩转SSRS第七篇---报表订阅
查看>>
WinCE API
查看>>
SQL语言基础
查看>>
对事件处理的错误使用
查看>>
最大熵模型(二)朗格朗日函数
查看>>
html img Src base64 图片显示
查看>>
[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction...
查看>>
FFMPEG中关于ts流的时长估计的实现(转)
查看>>
Java第三次作业
查看>>
【HDOJ 3652】B-number
查看>>
android代码混淆笔记
查看>>
Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction 并查集
查看>>
BMP文件的读取与显示
查看>>
Flash文字效果
查看>>
各种排序算法总结篇(高速/堆/希尔/归并)
查看>>
使用c#訪问Access数据库时,提示找不到可安装的 ISAM
查看>>
Linux常用基本命令[cp]
查看>>
CSS 相对|绝对(relative/absolute)定位系列(一)
查看>>
关于 Nginx 配置 WebSocket 400 问题
查看>>
Glide和Govendor安装和使用
查看>>