news 2026/6/3 16:09:28

第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/30 13:15:39

Qwen3-VL多模态开发套件:预置示例项目,30分钟出Demo

Qwen3-VL多模态开发套件&#xff1a;预置示例项目&#xff0c;30分钟出Demo 你是一位创业者&#xff0c;下周就要参加一场重要的创业路演。投资人最关心的是&#xff1a;你的产品有没有技术壁垒&#xff1f;能不能落地&#xff1f;但问题是——你不是技术出身&#xff0c;从零…

作者头像 李华
网站建设 2026/5/28 15:16:15

SAM3极限挑战:复杂背景下的精准物体分割

SAM3极限挑战&#xff1a;复杂背景下的精准物体分割 1. 技术背景与核心价值 随着计算机视觉技术的不断演进&#xff0c;图像分割已从早期依赖大量标注数据的监督学习模式&#xff0c;逐步迈向“零样本”推理的新阶段。传统的实例分割方法如Mask R-CNN虽然在特定任务中表现优异…

作者头像 李华
网站建设 2026/5/28 14:24:03

Llama3-8B模型监控:Prometheus+Grafana配置

Llama3-8B模型监控&#xff1a;PrometheusGrafana配置 1. 引言 1.1 业务场景描述 随着本地大模型部署的普及&#xff0c;如何高效、稳定地运行和管理像 Meta-Llama-3-8B-Instruct 这样的中等规模语言模型&#xff0c;成为开发者和运维团队关注的重点。在使用 vLLM Open Web…

作者头像 李华
网站建设 2026/5/29 21:52:42

推荐一个基于 .NET 8.0 和 VbenAdmin 框架开发的可视化作业调度管理系统

可视化作业调度Chet.QuartzNet.UI 是一套基于 .NET 8.0 与 VbenAdmin 构建的可视化作业调度管理系统。提供完整的任务调度能力&#xff0c;支持文件存储和数据库存储两种方式&#xff0c;旨在降低 Quartz.Net 的使用门槛&#xff0c;通过直观易用的界面帮助开发者轻松完成定时任…

作者头像 李华
网站建设 2026/5/28 22:33:52

Qwen3-14B中文处理实测:云端GPU低成本体验最强中文模型

Qwen3-14B中文处理实测&#xff1a;云端GPU低成本体验最强中文模型 你是不是也和我一样&#xff0c;对最近爆火的Qwen3系列大模型特别感兴趣&#xff1f;尤其是那个号称“中文能力最强”的Qwen3-14B&#xff0c;光是看评测就让人心痒痒。但一查部署要求——好家伙&#xff0c;…

作者头像 李华
网站建设 2026/5/28 14:24:09

FST ITN-ZH部署教程:构建智能文本处理系统

FST ITN-ZH部署教程&#xff1a;构建智能文本处理系统 1. 简介与背景 中文逆文本标准化&#xff08;Inverse Text Normalization, ITN&#xff09;是语音识别、自然语言处理和智能对话系统中的关键预处理环节。其核心任务是将口语化或非标准的中文表达转换为结构化的标准格式…

作者头像 李华