QT---------自定义插件和库

自定义界面组件

设计和使用自定义界面组件 (以 TBattery 为例)

假设我们要创建一个自定义的电池显示组件 TBattery,我们可以从 QWidget 派生一个新的类:

#include <QWidget>
#include <QPainter>class TBattery : public QWidget {Q_OBJECT
public:TBattery(QWidget *parent = nullptr);
protected:void paintEvent(QPaintEvent *event) override;
private:int batteryLevel; // 电池电量水平
};TBattery::TBattery(QWidget *parent) : QWidget(parent), batteryLevel(50) {// 初始化组件,例如设置大小等setFixedSize(100, 50);
}void TBattery::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 绘制电池轮廓painter.drawRect(0, 0, width() - 10, height() - 1);// 根据电量绘制填充部分int fillWidth = (width() - 10) * batteryLevel / 100;painter.fillRect(2, 2, fillWidth, height() - 4, Qt::green);
}

设计和使用 QT Designer Widget 插件

创建 QT Designer Widget 插件
  1. 创建一个新的插件项目。
  2. QDesignerCustomWidgetInterface 派生一个类,例如 TBatteryPlugin
#include <QDesignerCustomWidgetInterface>
#include <QtPlugin>
#include "tbattery.h"class TBatteryPlugin : public QObject, public QDesignerCustomWidgetInterface {Q_OBJECTQ_INTERFACES(QDesignerCustomWidgetInterface)
public:TBatteryPlugin(QObject *parent = nullptr);// 以下是 QDesignerCustomWidgetInterface 的实现部分bool isContainer() const override;bool isInitialized() const override;QIcon icon() const override;QString domXml() const override;QString group() const override;QString includeFile() const override;QString name() const override;QString toolTip() const override;QString whatsThis() const override;QWidget *createWidget(QWidget *parent) override;void initialize(QDesignerFormEditorInterface *core) override;
private:bool initialized;
};TBatteryPlugin::TBatteryPlugin(QObject *parent) : QObject(parent), initialized(false) {}bool TBatteryPlugin::isContainer() const { return false; }
bool TBatteryPlugin::isInitialized() const { return initialized; }
QIcon TBatteryPlugin::icon() const { return QIcon(); }
QString TBatteryPlugin::domXml() const {return "<ui language=\"c++\">\n"" <widget class=\"TBattery\" name=\"tBattery\">\n"" </widget>\n""</ui>";
}
QString TBatteryPlugin::group() const { return "Custom Widgets"; }
QString TBatteryPlugin::includeFile() const { return "tbattery.h"; }
QString TBatteryPlugin::name() const { return "TBattery"; }
QString TBatteryPlugin::toolTip() const { return "A custom battery widget"; }
QString TBatteryPlugin::whatsThis() const { return "This is a custom battery widget."; }
QWidget *TBatteryPlugin::createWidget(QWidget *parent) { return new TBattery(parent); }
void TBatteryPlugin::initialize(QDesignerFormEditorInterface *core) {if (initialized) return;initialized = true;
}
  1. 使用 Q_EXPORT_PLUGIN2 宏导出插件。
#include "tbatteryplugin.h"
Q_EXPORT_PLUGIN2(tbatteryplugin, TBatteryPlugin)
插件项目中各文件功能实现
  • tbattery.htbattery.cpp: 包含自定义组件 TBattery 的实现。
  • tbatteryplugin.htbatteryplugin.cpp: 实现 QDesignerCustomWidgetInterface 接口,用于在 QT Designer 中集成 TBattery 组件。
  • tbatteryplugin.json.pro 文件:包含插件的项目配置信息,如依赖、目标等。

在这里插入图片描述

插件的编译与安装
  1. 配置 .pro 文件,确保包含必要的模块和配置:
TEMPLATE = lib
CONFIG += plugin designer
HEADERS += tbattery.h tbatteryplugin.h
SOURCES += tbattery.cpp tbatteryplugin.cpp
  1. 编译项目,生成的插件文件(通常是 .dll.so)应放置在 QT Designer 的插件目录中,以便在设计器中加载。

使用自定义 widget 插件

  1. 打开 QT Designer,你应该可以在自定义组件库中看到 TBattery 组件。
  2. 将其拖放到界面上,像使用其他组件一样使用。

创建和使用静态库

创建静态库
  1. 创建一个新的库项目,在 .pro 文件中设置:
TEMPLATE = lib
CONFIG += staticlib
HEADERS += mylib.h
SOURCES += mylib.cpp
  1. 实现 mylib.hmylib.cpp
// mylib.h
#ifndef MYLIB_H
#define MYLIB_Hclass MyLib {
public:static void myFunction();
};#endif // MYLIB_H// mylib.cpp
#include "mylib.h"
#include <iostream>void MyLib::myFunction() {std::cout << "This is a function from the static library." << std::endl;
}
使用静态库
  1. 在另一个项目的 .pro 文件中添加:
LIBS += -L/path/to/lib -lmylib
INCLUDEPATH += /path/to/lib
  1. 包含头文件并调用函数:
#include "mylib.h"int main() {MyLib::myFunction();return 0;
}

创建和使用共享库

创建共享库
  1. .pro 文件中设置:
TEMPLATE = lib
CONFIG += shared
HEADERS += mylib.h
SOURCES += mylib.cpp
  1. 实现 mylib.hmylib.cpp 与静态库类似。
使用共享库
  1. .pro 文件中添加:
LIBS += -L/path/to/lib -lmylib
INCLUDEPATH += /path/to/lib
  1. 对于 Windows,可能需要将 .dll 文件复制到可执行文件目录或添加到系统路径。对于 Linux,可能需要设置 LD_LIBRARY_PATH
  2. 调用函数与静态库相同:
#include "mylib.h"int main() {MyLib::myFunction();return 0;
}

代码解释

  • 自定义界面组件TBattery 类通过重绘事件 paintEvent 来实现自定义绘制,它从 QWidget 派生,可根据需要添加属性和方法,以实现更复杂的功能。
  • QT Designer 插件TBatteryPlugin 类将 TBattery 集成到 QT Designer 中,QDesignerCustomWidgetInterface 接口提供了各种函数,如 createWidget 用于创建实际的自定义组件,domXml 提供 XML 信息,group 定义组件所属的组等。
  • 静态库:静态库会被链接到可执行文件中,使代码在运行时无需额外的库文件,但会增加可执行文件大小。
  • 共享库:共享库是独立的文件,可被多个程序共享,减少代码冗余,但需要在运行时加载,可能会涉及一些环境变量设置。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/500901.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物理知识1——电流

说起电流&#xff0c;应该从电荷说起&#xff0c;而说起电荷&#xff0c;应该从原子说起。 1 原子及其结构 常见的物质是由分子构成的&#xff0c;而分子又是由原子构成的&#xff0c;有的分子是由多个原子构成&#xff0c;有的分子只由一个原子构成。而原子的构成如图1所示。…

数据挖掘——支持向量机分类器

数据挖掘——支持向量机分类器 支持向量机最小间隔面推导基于软间隔的C-SVM非线性SVM与核变换常用核函数 支持向量机 根据统计学习理论&#xff0c;学习机器的实际风险由经验风险值和置信范围值两部分组成。而基于经验风险最小化准则的学习方法只强调了训练样本的经验风险最小…

Unity 对Sprite或者UI使用模板测试扣洞

新建两个材质球&#xff1a; 选择如下材质 设置如下参数&#xff1a; 扣洞图片或者扣洞UI的材质球 Sprite或者UI的材质球 新建一个单独Hole的canvas&#xff0c;将SortOrder设置为0&#xff0c;并将原UI的canvans的SortOrder设置为1 对2DSprite则需要调整下方的参数 hole的O…

【CSS in Depth 2 精译_099】17.5:基于页面滚动的动画时间线设置(全新)+ 17.6:最后一点建议 + 17.7:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 17 章 动画】 ✔️ 17.1 关键帧17.2 3D 变换下的动画设置 17.2.1 添加动画前页面布局的构建17.2.2 为布局添加动画 17.3 动画延迟与填充模式17.4 通过动画传递意图 17.4…

刷入super镜像报错 FAILED (remote: ‘Error: Last flash failed : Volume Full‘)

目录 1.背景 2.排查流程 3.追根溯源,找到根因 1.背景 首先刷入的底包 在修复此问题的过程中发现super.img镜像刷入不进去,报错FAILED (remote: Error: Last flash failed : Volume Full),此问题一般是分区有问题导致的 2.排查流程 由于是底包的分区大小和源码中的super…

Linux实验报告12-Apache服务器的配置

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 1&#xff1a;在WEB服务器上检查并安装必要软件 2&#xff1a;注册虚拟主机所要使用的域名 3&#xff1a;创建所需的目录 4&#xff1a;编辑配置文件 5&#xff1a;测试虚拟主机 一&#xff1a;实验目的 (1)了解…

WeNet:面向生产的流式和非流式端到端语音识别工具包

这篇文章介绍了WeNet&#xff0c;一个面向生产的开源端到端&#xff08;E2E&#xff09;语音识别工具包。WeNet的主要特点和贡献如下&#xff1a; 统一流式和非流式识别&#xff1a;提出了一种名为U2的两阶段框架&#xff0c;能够在单一模型中同时支持流式和非流式语音识别&…

从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路

一、前言 我们有个项目中用的 MySQL、Redis、ES、微服务都是单节点部署的&#xff0c;没有做集群模式部署&#xff0c;为了提高整体的可用性&#xff0c;对项目的部署架构进行了升级&#xff0c;支持高可用。 二、部署拓扑图 我们项目的测试环境 12 台服务器已经部署好了&am…

机器学习经典算法——线性回归

目录 算法介绍 一元线性回归模型 多元线性回归模型 ​误差项分析 相关系数 算法案例 一元线性回归预测——广告销售额案例 二元线性回归预测——血压收缩案例 多元线性回归预测——糖尿病案例 算法介绍 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种…

Nacos服务注册和发现

文章目录 Nacos服务注册和发现1. Nacos服务注册1.1 引入依赖1.2 配置Nacos1.3 重启服务1.4 Nacos后台 2. Nacos服务发现2.1 引入依赖2.2 配置Nacos2.3 服务发现 Nacos服务注册和发现 1. Nacos服务注册 服务提供者将服务注册到nacos注册中心 引入依赖配置Nacos地址重启 1.1 …

从企业级 RAG 到 AI Assistant,阿里云 Elasticsearch AI 搜索技术实践

在过去一年中&#xff0c;基座大模型技术的快速迭代推动了 AI 搜索的演进&#xff0c;主要体现在以下几个方面&#xff1a; 1.搜索技术链路重构 基于大模型的全面重构正在重塑 AI 搜索的技术链路。从数据采集、文档解析、向量检索到查询分析、意图识别、排序模型和知识图谱等…

BootstrapTable处理表格

需求背景 历史项目使用 BootstrapTable 作为前端组件 应客户需要调整&#xff1a; 冻结前四列对于大文本文字显示部分内容&#xff0c;鼠标悬浮显示完整内容 冻结列 1、引入相关CSS,JS CSS <link rel"stylesheet" href"/css/bootstrap.min.css"> …

《Vue3实战教程》35:Vue3测试

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 测试​ 为什么需要测试​ 自动化测试能够预防无意引入的 bug&#xff0c;并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…

【算法】模拟退火算法学习记录

写这篇博客的原因是博主本人在看某篇文章的时候&#xff0c;发现自己只是知道SGD这个东西&#xff0c;但是到底是个啥不清楚&#xff0c;所以百度了一下&#xff0c;然后在通过博客学习的时候看到了退火两个字&#xff0c;想到了本科做数模比赛的时候涉猎过&#xff0c;就上bil…

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算 一、简介 在MATLAB中计算Sobol二阶效应指数通常涉及到全局敏感性分析&#xff08;Global Sensitivity Analysis, GSA&#xff09;&#xff0c;其中Sobol方法是一种流行的技术&#xff0c;用于评估模型输入…

android studio android sdk下载地址

android studio安装后&#xff0c;因为公司网络原因&#xff0c;一直无法安装android sdk 后经过手机网络&#xff0c;安装android sdk成功如下&#xff0c;也可以手动下载后指定android sdk本地目录 https://dl.google.com/android/repository/source-35_r01.zip https://dl…

“AI人工智能软件开发公司:创新技术,引领未来

大家好&#xff01;今天我们来聊聊一个充满未来感的话题——AI人工智能软件开发公司。这个公司&#xff0c;用大白话说&#xff0c;就是专门研究和开发人工智能软件的地方&#xff0c;它们用最新的技术帮我们解决问题&#xff0c;让生活和工作变得更智能、更便捷。听起来是不是…

ACL的注意事项

ACL只对数据进行抓取和匹配&#xff0c;ACl本身不对数据做拒绝和允许的操作&#xff0c;只有在接口方向上应用后才对数据进行拒绝或允许的操作。 ACl只在packetfilter包过滤时默认动作是允许&#xff0c;这个时候至少需要有一条deny规则&#xff0c;否则全都是允许的规则&…

gitlab 还原合并请求

事情是这样的&#xff1a; 菜鸡从 test 分支切了个名为 pref-art 的分支出来&#xff0c;发布后一机灵&#xff0c;发现错了&#xff0c;于是在本地用 git branch -d pref-art 将该分支删掉了。之后切到了 prod 分支&#xff0c;再切出了一个相同名称的 pref-art 分支出来&…

webserver的http实现

1、用了状态机&#xff0c;为什么要用状态机&#xff1f; 在逻辑处理模块中&#xff0c;响应的http请求采用主从状态机完成&#xff0c; 传统的控制流程都是按照顺序执行的&#xff0c;状态机能够处理任意顺序的事件&#xff0c;并能提供有意义的响应--即使这些事件发生的顺序和…