news 2026/6/2 12:14:17

第11章 自定义库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第11章 自定义库

第十一章 自定义库

当Qt Designer提供的界面组件无法满足实际设计需求时,提供了两种方法来自定义和扩展界面组件:提升法和设计自定义Widget插件。

  1. 提升法

    这种方法主要用于将已有的组件(如QGraphicsView)提升为自定义的类(如TGraphicsView)。这样做可以在原有组件的基础上增加更多的自定义属性和功能,同时保留原有组件的大部分特性和行为。这种方法操作相对简单,适用于对现有组件进行小幅度定制的情况。

  2. 设计自定义Widget插件

    如果需要更深入的自定义或者需要经常使用某个自定义组件,那么可以通过设计自己的Widget插件并安装到Qt Designer的组件面板中。这样,该自定义组件的使用就像Qt自带的界面设计组件一样方便。这种方法更为灵活和强大,但需要更多的开发和配置工作。

自定义插件和库

当Qt Designer自带的组件无法满足特定需求时,开发者可以通过继承QWidget或其它界面组件类来创建自定义的界面组件。这样的自定义组件可以具有特殊的显示效果和功能。

文中以一个示例项目samp11_1为例,详细解释了如何从QWidget类继承创建一个自定义界面组件类TBattery,并展示了如何在程序中使用这个组件。这个组件具有显示电池图形和根据电量更新显示的功能,通过重写paintEvent()函数来实现特殊的界面显示效果。此外,还使用了滑动条来动态设置电池电量,电池图形的显示也会随之更新。

做一个插件

Qt Designer Widget 插件

如何做插件

使用插件

Qt插件API概述

  • Qt提供了两套插件API:高级API用于扩展Qt本身的功能(如数据库驱动、图像格式等),低级API用于扩展自行编写应用程序的功能,特别是创建Qt Designer Widget插件。

插件安装目录与示例

  • 介绍了Qt自带插件的安装目录,并举例说明了如imageformatssqldrivers等插件的存放位置及其作用。

创建Qt Designer Widget插件

  • 以创建TPBattery类为例,详细描述了使用Qt Creator创建Qt Designer Widget插件的过程,包括设置插件项目名称、选择开发套件、设置自定义Widget类名称、设置插件名称和资源文件名称等步骤。

编译与安装注意事项

  • 强调了编译插件时编译器的重要性,必须与编译Qt Creator的编译器一致,否则插件无法在Qt Designer中正常显示。
  • 说明了Debug和Release模式编译的插件分别适用于不同模式编译的应用程序,并指出Debug模式下编译的插件文件名后会增加“d”字母。

编译结果

  • 描述了编译后生成的文件(如tpbatteryplugin.dlltpbatteryplugin.lib),并解释了文件名后缀“d”的含义。

静态库

静态库的使用

当第三方代码以源程序文件的形式提供时,可以直接将文件加入项目进行编译。静态库则是将编译好的目标文件进行归档处理得到的库文件,其特点是编译时会嵌入到可执行文件中,无需在运行时额外加载。

使用静态库时,需要确保静态库的头文件和库文件都已正确添加到项目中,并在编译链接时指定静态库的路径。

大型软件项目中的使用

对于大型软件项目,使用动态库更为合适,因为可以独立更新和维护库文件,而不需要重新编译整个应用程序。例如,VTK和OpenCV等大型软件库通常会被编译为动态库供其他项目使用。

Qt Creator中的操作

Qt Creator支持创建和管理静态库和动态库项目。无论是MSVC还是MinGW等编译器,都可以在Qt Creator中创建相应的库文件。

创建静态库

在Qt中创建静态库的过程与创建共享库类似,但有一些不同之处。下面是创建静态库的步骤:

步骤1:创建一个新项目

  1. 打开 Qt Creator。
  2. 选择“新建项目”。
  3. 选择“库”下的“C++静态库”。
  4. 点击“继续”,根据提示设置项目名称和路径。

步骤2:设置项目文件(.pro

在项目的.pro文件中,添加以下配置以指定创建静态库:

QT += core QT -= gui # 如果不需要GUI支持 CONFIG += c++11 # 选择C++11标准 CONFIG += staticlib # 指定为静态库 TARGET = mystaticlibrary # 静态库名称

步骤3:编写代码

创建一个头文件和实现文件。例如,创建mymath.hmymath.cpp

mymath.h

#ifndefMYMATH_H#defineMYMATH_HclassMyMath{public:staticdoubleadd(doublea,doubleb);};#endif// MYMATH_H

mymath.cpp

#include"mymath.h"doubleMyMath::add(doublea,doubleb){returna+b;}

步骤4:构建静态库

  1. 在 Qt Creator 中,选择构建(Build)按钮。
  2. 选择“构建项目”以生成静态库。

构建完成后,你会在项目的输出目录(通常是releasedebug文件夹)中找到生成的静态库文件(.a.lib)。

步骤5:使用静态库

要在其他 Qt 项目中使用这个静态库,请按照以下步骤:

  1. 将生成的静态库文件复制到新的项目目录的某个位置。
  2. 在新项目的.pro文件中添加如下配置:
INCLUDEPATH += path/to/mylibrary # 头文件路径 LIBS += -Lpath/to/mylibrary -lmystaticlibrary # 库文件路径

在代码中包含头文件并调用库中的函数:

#include"mymath.h"intmain(){doubleresult=MyMath::add(1.0,2.0);// ...}

使用静态库

步骤1:创建一个新项目

  1. 打开Qt Creator。
  2. 选择“新建项目”。
  3. 选择“库”下的“C++静态库”。
  4. 点击“继续”,并设置项目名称和路径。

步骤2:设置项目文件(.pro

在项目的.pro文件中,添加以下配置以指定创建静态库:

QT += core QT -= gui # 如果不需要GUI库 CONFIG += c++11 # 选择C++11标准 CONFIG += static # 指定为静态库 TARGET = mylibrary # 静态库名称

步骤3:编写代码

创建头文件和实现文件。例如,创建mymath.hmymath.cpp

mymath.h

#ifndefMYMATH_H#defineMYMATH_HclassMyMath{public:staticdoubleadd(doublea,doubleb);};#endif// MYMATH_H

mymath.cpp

#include"mymath.h"doubleMyMath::add(doublea,doubleb){returna+b;}

步骤4:构建静态库

  1. 在Qt Creator中,选择构建(Build)按钮。
  2. 选择“构建项目”以生成静态库。

构建完成后,你会在项目的输出目录(通常是releasedebug文件夹)中找到生成的静态库文件(例如,.a.lib)。

步骤5:使用静态库

要在其他Qt项目中使用这个静态库,请按照以下步骤:

  1. 将生成的静态库文件复制到新的项目目录的某个位置。
  2. 在新项目的.pro文件中添加如下配置:
INCLUDEPATH += path/to/mylibrary # 头文件路径 LIBS += -Lpath/to/mylibrary -lmylibrary # 链接库文件

在代码中包含头文件并调用库中的函数:

#include"mymath.h"intmain(intargc,char*argv[]){// 调用静态库中的函数doubleresult=MyMath::add(1.0,2.0);// ...}

动态库

在Qt中,动态库被称为共享库,在 Windows 平台上就是动态链接库。共享库项目编译后生成后缀为“.dll”的动态链接库文件,.dll文件是在应用程序运行时才被加载和调用的,不像静态库那样在编译期间就被嵌入可执行文件。若更新了.dll 文件版本,只要接口未变,应用程序就可以正常调用动态链接库。

动态库的使用

动态库则是在运行时被链接和使用的库文件,不会嵌入到可执行文件中。这种库的优势在于更新时无需重新编译整个项目,灵活性更高。Qt项目在编译和运行时通常会使用到动态库。

动态库的文件名后缀因平台和编译器不同而有所差异,如Windows平台上的“.dll”文件。在Qt Creator中,可以创建和管理动态库项目。

创建共享库

在Qt中创建共享库(动态链接库)比较简单。下面是创建共享库的步骤:

步骤1:创建一个新项目

  1. 打开Qt Creator。
  2. 选择“新建项目”。
  3. 选择“库”下的“C++共享库”。
  4. 点击“继续”,并根据提示设置项目名称和路径。

步骤2:设置项目文件(.pro

在项目的.pro文件中,添加以下配置以指定创建动态库:

QT += core QT -= gui # 如果不需要GUI库 CONFIG += c++11 # 选择C++11标准 CONFIG += shared # 指定为共享库 TARGET = mylibrary # 共享库名称

步骤3:编写代码

创建一个头文件和实现文件。例如,创建mymath.hmymath.cpp

mymath.h

#ifndefMYMATH_H#defineMYMATH_H#include<QtCore/qglobal.h>#ifdefined(MYMATH_LIBRARY)#defineMYMATH_EXPORTQ_DECL_EXPORT#else#defineMYMATH_EXPORTQ_DECL_IMPORT#endifclassMYMATH_EXPORTMyMath{public:staticdoubleadd(doublea,doubleb);};#endif// MYMATH_H

mymath.cpp

#include"mymath.h"doubleMyMath::add(doublea,doubleb){returna+b;}

步骤4:构建共享库

  1. 在Qt Creator中,选择构建(Build)按钮。
  2. 选择“构建项目”以生成共享库。

构建完成后,你会在项目的输出目录(通常是releasedebug文件夹)中找到生成的共享库文件(.dll.so.dylib)。

步骤5:使用共享库

要在其他Qt项目中使用这个共享库,请按照以下步骤:

  1. 将生成的共享库文件复制到新的项目目录的某个位置,或将其添加到系统路径。
  2. 在新项目的.pro文件中添加如下配置:
INCLUDEPATH += path/to/mylibrary # 头文件路径 LIBS += -Lpath/to/mylibrary -lmylibrary # 库文件路径
  1. 在代码中包含头文件并调用库中的函数:
#include"mymath.h"intmain(){doubleresult=MyMath::add(1.0,2.0);// ...}

使用共享库

调用共享库(也称为动态链接库,DLL或so文件)的方式有两种,分别是显式链接和隐式链接。

1、共享库的调用方式

Qt支持使用共享库来组织和重用代码。共享库可以被多个程序共享,减少内存占用和磁盘空间使用。

显式链接

在显式链接中,程序在运行时加载共享库,并且可以动态地使用库中的函数。你需要使用dlopendlsym来加载和调用库。

**示例:**假设有一个共享库libmymath.so,其包含一个加法函数。

// mymath.hextern"C"doubleadd(doublea,doubleb);// mymath.cpp#include"mymath.h"extern"C"doubleadd(doublea,doubleb){returna+b;}

使用显式链接:

#include<QCoreApplication>#include<QDebug>#include<dlfcn.h>// 用于Linux共享库intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);void*handle=dlopen("libmymath.so",RTLD_LAZY);if(!handle){qDebug()<<"Cannot open library:"<<dlerror();return1;}typedefdouble(*add_t)(double,double);add_t add=(add_t)dlsym(handle,"add");if(!add){qDebug()<<"Cannot load symbol 'add':"<<dlerror();dlclose(handle);return1;}doubleresult=add(1.0,2.0);qDebug()<<"Result:"<<result;dlclose(handle);returna.exec();}

2、隐式链接调用共享库

隐式链接是一种在编译时链接共享库的方法。在编译时,编译器会知道库的存在,并根据选择的编译选项来链接库。

示例:设置项目文件(.pro)来使用共享库。

# myproject.pro TEMPLATE = app TARGET = MyApp QT += core SOURCES += main.cpp LIBS += -L$$PWD/ -lmymath # 指定库路径和链接库名

然后在代码中直接调用库中的方法:

#include<QCoreApplication>#include<QDebug>#include"mymath.h"// 包含头文件intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);doubleresult=add(1.0,2.0);// 直接调用qDebug()<<"Result:"<<result;returna.exec();}

总结

  • 显式链接适合于需要在运行时决定是否加载库的场景。使用动态加载提供了更大的灵活性。
  • 隐式链接在编译时进行,与标准的编译和链接过程相似,通常用于更简单的情况。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 11:50:12

完整示例演示RS232和RS485通信测试

当串口不再“简单”&#xff1a;一次讲透RS232与RS485的实战差异你有没有遇到过这样的场景&#xff1f;设备明明通电正常&#xff0c;代码也烧录无误&#xff0c;但就是收不到数据。换根线试试——好了&#xff1b;可一拉长距离&#xff0c;又开始丢包。最后查了半天&#xff0…

作者头像 李华
网站建设 2026/6/2 10:47:44

AI智能二维码工坊性能优化:提升大批量生成效率的秘诀

AI智能二维码工坊性能优化&#xff1a;提升大批量生成效率的秘诀 1. 背景与挑战&#xff1a;当“极速”遇上“海量” 在数字化办公、营销推广和物联网设备管理等场景中&#xff0c;二维码已成为信息传递的重要载体。随着业务规模扩大&#xff0c;单一或小批量生成已无法满足需…

作者头像 李华
网站建设 2026/5/29 4:27:47

孤能子视角:基于“弱关系“的“水泡“经济

我的问题: 分分合合之时&#xff0c;也特别多的机会&#xff0c;比如"弱关系"流量、"弱关系"经济。它不是"风口"经济(趋势经济)&#xff0c;它更像"昙花一现"&#xff0c;或者像"水泡"经济&#xff0c;就一阵风&#xff0c…

作者头像 李华
网站建设 2026/5/20 10:23:32

零基础AI编程周体验:IQuest-Coder每日挑战指南

零基础AI编程周体验&#xff1a;IQuest-Coder每日挑战指南 你是不是也经常看到别人用AI写代码、自动修复bug、甚至一键生成完整项目&#xff0c;自己却不知道从哪下手&#xff1f;别担心&#xff0c;这正是我们设计“7天AI编程挑战”的初衷——让零基础的小白也能轻松上手AI编…

作者头像 李华
网站建设 2026/5/29 3:01:20

华硕笔记本电池优化实战:从80%到95%续航提升的完整方案

华硕笔记本电池优化实战&#xff1a;从80%到95%续航提升的完整方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地…

作者头像 李华
网站建设 2026/5/31 13:25:56

2025 中小企业 CRM 选型指南——高性价比 CRM TOP5

一套适配的 CRM 能帮中小企业解决 3 大核心痛点&#xff1a;客户资源流失、销售效率低下、决策缺乏数据支撑。例如某工贸企业通过 CRM 整合客户跟进记录&#xff0c;客户流失率下降 28%&#xff1b;某电商团队借助自动化流程&#xff0c;手动录入工作量减少 60%。二、中小企业必…

作者头像 李华