当前位置:网站首页>【QT】自定义工程封装成DLL并如何调用(带ui界面的)
【QT】自定义工程封装成DLL并如何调用(带ui界面的)
2022-08-02 23:26:00 【Cappuccino-jay】
一、动态库的封装
1、首先新建一个Library工程
2、修改类型为共享库,自定义项目名称以及项目路径
3、选择编译器
4、选择动态库所需要的模块
5、自定义类名,点击下一步
6、点击下一步
7、项目总览
8、此时的文件中还没有ui文件,因为要封装带界面的动态库,需要右键点击工程->add new
9、在新弹出的窗口中选择Qt -> Qt设计师界面类
10、选择Widget界面模板
11、将其命名为与当前工程相同的名字,以覆盖之前不带ui界面的文件
12、点击完成
13、之后会弹出如下两个窗口,分别点击 OK 和 Yes to All
14、此时可以看到该工程文件下面多出了 .ui文件
15、点击 .pro 文件,删除重复的内容
16、如果文件报红,说明缺少一些模块(缺少了widgets模块)
17、添加如下,错误可消失
18、不过此时的工程还不能直接打包成动态库,因为旧的文件被覆盖掉了,新的文件无法打包成动态库,因此需要对新的文件进行修改
I、此时新的DynamicLib.h文件内容如下:
II、需要将其修改为下面的内容:
需要添加头文件#include "dynamiclib_global.h"
以及 在类名前添加 DYNAMICLIBSHARED_EXPORT
语句。
III、DYNAMICLIBSHARED_EXPORT
语句可以在头文件 dynamiclib_global.h
中直接复制过来,就是下方代码中,红色框圈出来的部分:
19、在这个界面上添加一个按钮,并给这个按钮添加对应的槽函数
20、编写槽函数内容
21、然后点击构建、运行,生成动态库文件
22、生成的库文件在它自己的Debug文件夹下
23、还需要用到一个文件就是它自己的头文件,dynamiclib_global.h
也一定要带上
此时,动态库封装就已经算完成了,需要用到的文件也就是上面标记出来的四个。
二、动态库的调用:在另一个新的工程中使用这个动态库
1、创建一个新的带界面的工程
2、项目总览
3、之后在工程LibTest项目目录下添加两个新的文件夹 include 和 lib
- 将
DynamicLib.h
和dynamiclib_global.h
文件放到include
文件夹中 - 将
DynamicLib.lib
放到lib
文件夹中
4、然后在LibTest.pro文件中添加如下语句,引入动态库
INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -lDynamicLib
其中指出了动态库需要的头文件路径,动态库的所在路径,以及动态库名字。$$PWD表示工程目录,-l后面表示库文件的名字,不包含后缀.lib。
然后在使用动态库的文件中添加需要使用的头文件,进行使用。
5、然后开始编辑mainwindow.ui
添加一个StackedWidget组件,第一页上面放一个按钮,点击这个按钮,跳转到第二页,第二页放置封装的动态库界面。
6、先给pushButton添加槽函数
7、然后在MainWindow中添加一个DynamicLib对象以及引入动态库的头文件
8、在构造函数中添加如下代码
9、这时会遇到一个问题:就是程序异常结束没法运行成功
10、这是因为还有一个文件没有用上,那就是dll文件,还需要将DynamicLib.dll
文件放到LibTest.exe
同级的文件夹下,否则程序运行时找不到动态库,程序就会崩溃
由于此时是debug阶段,LibTest.exe文件在debug文件夹下,因此将dll放到这里:
同理,当release打包之后,dll依然放到exe文件的同级目录中即可。
11、然后再重新构建、运行
程序便启动成功了:
12、点击按钮,跳转到了第二个界面上
13、再点击测试按钮
可以看到下面打印了 Dynamic Link Lib Test!!!
字符串,说明动态库可以正常调用。
三、补充:简便方法
假如现在有一个名为CustomMessageBox的GUI进程,想要将其改为DLL,需要做如下修改(注意红色部分为类名的大写,需要根据实际情况修改红色文本部分的内容。):
1、修改配置文件
1 #TEMPLATE = app
2
3 DEFINES += CUSTOMMESSAGEBOX_LIBRARY
4 TEMPLATE = lib
2、在导出类的头文件上加如下代码
1 #if defined(CUSTOMMESSAGEBOX_LIBRARY)
2 # define CUSTOMMESSAGEBOXSHARED_EXPORT Q_DECL_EXPORT
3 #else
4 # define CUSTOMMESSAGEBOXSHARED_EXPORT Q_DECL_IMPORT
5 #endif
3、修改导出类定义
1 //class CustomMessageBox : public QDialog
2 class CUSTOMMESSAGEBOXSHARED_EXPORT CustomMessageBox : public QDialog
4、编译
若是 MinGW32
编译器,在编译之后会在文件夹下找到 ***.dll
和 ***.a
文件;若是 MSVC
编译器,则应该是 ***.dll
和 ***.lib
。
5、使用
在使用该库的程序中,新建一个 include
文件夹,将 ***.a
文件 和 导出类的头文件
复制进这个文件夹,在程序中引入该头文件即可。在编译之后,将不同模式编译下的 dll
文件放入程序编译后的文件夹中,才能正常运行程序。
边栏推荐
- 【多线程】Thread类的基本用法
- ORA-55610: Invalid DDL statement on history-tracked table
- Teach you to locate online MySQL slow query problem hand by hand, package teaching package meeting
- Database auditing - an essential part of network security
- Cholesterol-PEG-Acid,胆固醇-聚乙二醇-羧基保持在干燥、低温环境下
- Merge two excel spreadsheet tools
- IDEA 重复代码的黄色波浪线取消设置
- 令人心动的AI综述(1)
- APT level comprehensive free kill with Shell
- 精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队
猜你喜欢
随机推荐
为了面试阿里,熬夜肝完这份软件测试笔记后,Offer终于到手了
Day117. Shangyitong: Generate registered order module
Database auditing - an essential part of network security
别再到处乱放配置文件了!我司使用 7 年的这套解决方案,稳的一秕
ORA-55610: Invalid DDL statement on history-tracked table
华为设备配置BFD与接口联动(触发与BFD联动的接口物理状态变为Down)
十三、数据回显
Jmeter二次开发实现rsa加密
2022山东国际青少年眼睛健康产业展会,视力健康展,眼视光展
【问题征集】向 iPod 之父、iPhone 联合设计者、Google Nest 创始人 Tony Fadell 提问啦
CAS:474922-22-0,DSPE-PEG-MAL,磷脂-聚乙二醇-马来酰亚胺科研试剂供应
Find My技术|智能防丢还得看苹果Find My技术
九零后程序员心声:互联网的同行们,别卷了,再卷人都卷没了
js基础知识整理之 —— Math
js基础知识整理之 —— 闭包
Day117.尚医通:生成挂号订单模块
科研用Cholesterol-PEG-NHS,NHS-PEG-CLS,胆固醇-聚乙二醇-活性酯
语音合成模型小抄(1)
最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解
Rebound shell principle and implementation