【QT】自定义工程封装成DLL并如何调用(带ui界面的)

这篇具有很好参考价值的文章主要介绍了【QT】自定义工程封装成DLL并如何调用(带ui界面的)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、动态库的封装

1、首先新建一个Library工程

qt调用自编程序,QT,qt,ui,dll

2、修改类型为共享库,自定义项目名称以及项目路径

qt调用自编程序,QT,qt,ui,dll

3、选择编译器

qt调用自编程序,QT,qt,ui,dll

4、选择动态库所需要的模块

qt调用自编程序,QT,qt,ui,dll

5、自定义类名,点击下一步

qt调用自编程序,QT,qt,ui,dll

6、点击下一步

qt调用自编程序,QT,qt,ui,dll

7、项目总览

qt调用自编程序,QT,qt,ui,dll

8、此时的文件中还没有ui文件,因为要封装带界面的动态库,需要右键点击工程->add new

qt调用自编程序,QT,qt,ui,dll

9、在新弹出的窗口中选择Qt -> Qt设计师界面类

qt调用自编程序,QT,qt,ui,dll

10、选择Widget界面模板

qt调用自编程序,QT,qt,ui,dll

11、将其命名为与当前工程相同的名字,以覆盖之前不带ui界面的文件

qt调用自编程序,QT,qt,ui,dll

12、点击完成

qt调用自编程序,QT,qt,ui,dll

13、之后会弹出如下两个窗口,分别点击 OK 和 Yes to All

qt调用自编程序,QT,qt,ui,dll
qt调用自编程序,QT,qt,ui,dll

14、此时可以看到该工程文件下面多出了 .ui文件

qt调用自编程序,QT,qt,ui,dll

15、点击 .pro 文件,删除重复的内容

qt调用自编程序,QT,qt,ui,dll

16、如果文件报红,说明缺少一些模块(缺少了widgets模块)

qt调用自编程序,QT,qt,ui,dll

17、添加如下,错误可消失

qt调用自编程序,QT,qt,ui,dll

18、不过此时的工程还不能直接打包成动态库,因为旧的文件被覆盖掉了,新的文件无法打包成动态库,因此需要对新的文件进行修改

I、此时新的DynamicLib.h文件内容如下:
qt调用自编程序,QT,qt,ui,dll
II、需要将其修改为下面的内容:
需要添加头文件#include "dynamiclib_global.h" 以及 在类名前添加 DYNAMICLIBSHARED_EXPORT 语句。
qt调用自编程序,QT,qt,ui,dll
III、DYNAMICLIBSHARED_EXPORT 语句可以在头文件 dynamiclib_global.h中直接复制过来,就是下方代码中,红色框圈出来的部分:
qt调用自编程序,QT,qt,ui,dll

19、在这个界面上添加一个按钮,并给这个按钮添加对应的槽函数

qt调用自编程序,QT,qt,ui,dll

20、编写槽函数内容

qt调用自编程序,QT,qt,ui,dll

21、然后点击构建、运行,生成动态库文件

qt调用自编程序,QT,qt,ui,dll

22、生成的库文件在它自己的Debug文件夹下

qt调用自编程序,QT,qt,ui,dll

23、还需要用到一个文件就是它自己的头文件,dynamiclib_global.h也一定要带上

qt调用自编程序,QT,qt,ui,dll
此时,动态库封装就已经算完成了,需要用到的文件也就是上面标记出来的四个。

二、动态库的调用:在另一个新的工程中使用这个动态库

1、创建一个新的带界面的工程

qt调用自编程序,QT,qt,ui,dll

2、项目总览

qt调用自编程序,QT,qt,ui,dll

3、之后在工程LibTest项目目录下添加两个新的文件夹 include 和 lib
  • DynamicLib.hdynamiclib_global.h文件放到include文件夹中
  • DynamicLib.lib放到lib文件夹中

qt调用自编程序,QT,qt,ui,dll

4、然后在LibTest.pro文件中添加如下语句,引入动态库
INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -lDynamicLib

qt调用自编程序,QT,qt,ui,dll

其中指出了动态库需要的头文件路径,动态库的所在路径,以及动态库名字。$$PWD表示工程目录,-l后面表示库文件的名字,不包含后缀.lib。
然后在使用动态库的文件中添加需要使用的头文件,进行使用。

5、然后开始编辑mainwindow.ui

添加一个StackedWidget组件,第一页上面放一个按钮,点击这个按钮,跳转到第二页,第二页放置封装的动态库界面。
qt调用自编程序,QT,qt,ui,dll

6、先给pushButton添加槽函数

qt调用自编程序,QT,qt,ui,dll

7、然后在MainWindow中添加一个DynamicLib对象以及引入动态库的头文件

qt调用自编程序,QT,qt,ui,dll

8、在构造函数中添加如下代码

qt调用自编程序,QT,qt,ui,dll

9、这时会遇到一个问题:就是程序异常结束没法运行成功

qt调用自编程序,QT,qt,ui,dll

10、这是因为还有一个文件没有用上,那就是dll文件,还需要将DynamicLib.dll文件放到LibTest.exe同级的文件夹下,否则程序运行时找不到动态库,程序就会崩溃

由于此时是debug阶段,LibTest.exe文件在debug文件夹下,因此将dll放到这里:

qt调用自编程序,QT,qt,ui,dll
同理,当release打包之后,dll依然放到exe文件的同级目录中即可。

11、然后再重新构建、运行

程序便启动成功了:
qt调用自编程序,QT,qt,ui,dll

12、点击按钮,跳转到了第二个界面上

qt调用自编程序,QT,qt,ui,dll

13、再点击测试按钮

qt调用自编程序,QT,qt,ui,dll
可以看到下面打印了 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 文件放入程序编译后的文件夹中,才能正常运行程序。文章来源地址https://www.toymoban.com/news/detail-779940.html

到了这里,关于【QT】自定义工程封装成DLL并如何调用(带ui界面的)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Qt学习】05:自定义封装界面类

    1.QListWidget 2.QTreeWidget 3.QTableWidget 4.StackedWidget 5.Others 6.自定义封装界面类-显示效果 创建自定义封装界面类步骤一般如下, (1)添加设计师界面类 添加新文件,Qt-设计师界面类, 根据需要选择界面模板即可,这里选择Widget作为界面模板进行创建, 根据语义为自定义的界面类

    2024年02月11日
    浏览(20)
  • QT QPluginLoader 插件开发 ui界面打包dll

     将项目模块化,每一个模块单独开发,模块的组成形成最终的主程序, 点击左侧按钮就会弹出对应的插件应用,每一个子窗口都是单独的dll 插件, 灵活,升级,下载,卸载。 效果:     打开QT Creator 新建插件开发项目  下一步后选择 Qt Plugin 开发 添加依赖库,在.pro里  

    2024年02月11日
    浏览(35)
  • Qt调用主界面ui

    在其他类中使用主界面ui,this,控件操作等 首先,子类需要包含主界面的头文件和ui_xx.h文件,声明主界面类 然后使用构造函数把主界面的指针传递给子类 子类头文件: 子类cpp文件: 主界面头文件设置ui为公有: 主界面cpp文件设置: 效果图:

    2024年02月02日
    浏览(43)
  • Qt6之vc调用qt生成的带ui的dll

    受益于跨平台的特性,Qt生成dll的各种语言调用上体现的淋漓尽致,上篇已经演示了qt生成的无ui的dll及vc如何调用它,本篇将演示vc如何调用qt生成的带ui的dll。 传统观点认为Qt生成的带ui的dll受限于 QApplication 的 exec 方法,这样才能产生消息循环于是只能采用QTWinmigrate中重写

    2024年02月12日
    浏览(32)
  • QT6为工程添加资源文件,并在ui界面引用

    这种方式虽然添加到了工程中,但不能在UI设计界面完成引用。主要原因可能是未把文件放入到项目资源文件中,以下面一种方式可以看出区别。 选择qt resource file,点击选择, 然后通过下面的设置得到一个.qrc的资源文件, 鼠标右键这个资源文件,第一种添加的文件在qrc文件

    2024年02月11日
    浏览(34)
  • 将QT的UI界面转换成python文件并调用

    在QTcreator中或者QTdesigner中画好的ui界面转换成python文件,在pycharm中直接调用。 在pycharm中的终端运行命令 : *.py是对应生成的python文件的名字,*.ui是画的UI界面(对应ui界面的路径) 然后就会生成login.py文件,如下: 调用文件: 运行结果:

    2024年02月11日
    浏览(35)
  • 基于C++和Qt封装一个简单的socket(TCP/IP)通信UI界面

            最近在学习TCP/IP和socket套接字的有关知识,了解了三次握手四次挥手,TCP协议等等一大堆知识,但纸上得来终觉浅。网络上C++代码实现socket通信的资料很多,方便学习,于是想到自己用Qt实现一个基础的具有网络通信收发功能的服务端UI软件。进入正题:        

    2024年02月08日
    浏览(39)
  • 【Visual Studio】Qt 在其他 cpp 文件中调用操作 ui 界面控件

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 还整了一个如何相互之间调用函数的文章,感兴趣可以看:【Visual Studio】Qt 在其他 cpp 文件中调用主工程下文件中的函数。 主界面工程为 A ,添加的文件名字为 test ,目标是在

    2024年02月05日
    浏览(39)
  • 12-2_Qt 5.9 C++开发指南_自定义Qt Designer 插件(UI 设计器自定义界面组件的 Widget 插件,直接安装到 UI设计器组件面板里,如同 Qt 自带的界面设计组件一样)

    上篇使用提升法(promotion)来创建自定义组件,本篇为 UI 设计器设计自定义界面组件的 Widget 插件,直接安装到 UI设计器的组件面板里,如同 Qt 自带的界面设计组件一样使用,在设计时就能看到组件的实际显示效果,只是编译和运行时需要使用到插件的动态链接库 (Windows 平台上

    2024年02月05日
    浏览(35)
  • Qt/C++自定义界面大全/20套精美皮肤/26套精美UI界面/一键换肤/自定义颜色/各种导航界面

    这个系列对应自定义控件大全,一个专注于控件的编写,一个专注于UI界面的编写,程序员有两大软肋,一个是忌讳别人说自己的程序很烂很多bug,一个就是不擅长UI,基本上配色就直接rgb,对于第一点,只要放松心态,直面自己的不足,不断改进,才能问鼎武林至尊。至于第

    2024年01月20日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包