十一、Qt自定义Widget组件、静态库与动态库
一、自定义Widget组件
1、自定义Widget组件
使用步骤
- 采用提升法(promotion)
- 重新定义paintEvent事件
2、实现程序

(1)创建项目,基于QWidget

(2)添加类,为Widget组件提升类
#include "battery.h"
#include <QPainter>int Battery::powerLevel() const
{return mPowerLevel;
}void Battery::setPowerLevel(int powerLevel)
{mPowerLevel = powerLevel;repaint();
}void Battery::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 120, 50); // 设置窗口逻辑坐标painter.setRenderHint(QPainter::Antialiasing);painter.setRenderHint(QPainter::TextAntialiasing);// 绘制电池边框QPen pen;pen.setWidth(2);pen.setColor(mColorBorder);pen.setStyle(Qt::SolidLine);pen.setCapStyle(Qt::FlatCap);pen.setJoinStyle(Qt::BevelJoin);painter.setPen(pen);QBrush brush;brush.setColor(mColorBack);brush.setStyle(Qt::SolidPattern);painter.setBrush(brush);rect.setRect(1, 1, 109, 48);painter.drawRect(rect);brush.setColor(mColorBorder);painter.setBrush(brush);rect.setRect(110, 15, 10, 20);painter.drawRect(rect);// 画电量if(mPowerLevel <= mWarning){brush.setColor(mColorWarning);pen.setColor(mColorWarning);}else{brush.setColor(mColorPower);pen.setColor(mColorPower);}painter.setBrush(brush);painter.setPen(pen);if(mPowerLevel > 0){rect.setRect(5, 5, mPowerLevel, 40);painter.drawRect(rect);}// 绘制百分比文字QFontMetrics textSize(this->font());QString powerStr = QString::asprintf("%d%%", mPowerLevel);QRect textRect = textSize.boundingRect(powerStr);pen.setColor(mColorBorder);painter.setPen(pen);painter.drawText(55 - textRect.width() / 2, 23 + textRect.height() / 2, powerStr);}Battery::Battery(QWidget *parent) : QWidget(parent)
{}
(3)设置标题和图标(图标需要选择资源中图标,直接选择文件可能无效)

(4)实现电池电量修改
#include "widget.h"
#include "ui_widget.h"#include "battery.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);ui->battery->setPowerLevel( ui->horizontalSlider->value() );
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{int nPower = ui->horizontalSlider->value();ui->battery->setPowerLevel(nPower);ui->label->setText(QString::asprintf("当前电量: %d%%", nPower));
}

二、自定义QtDesigner插件
1、实现程序
(1)创建自定义控件工程


设置分组

(2)将生成的dll库拷贝到Tools\QtCreator\bin\plugins\designer下
(3)创建项目,基于QWidget
在UI编辑界面组件栏可以看到多分组MyWidget下有了Battery组件。(我没做出来,始终是加载失败,之后测试处理)
初步分析:似乎因为Qt IDE是由MSVC编译,所以插件必须为MSVC编译(本人使用MSVC2015 64bit测试,没有加载成功,之后测试32bit)


三、静态链接库
1、静态链接库的创建和使用
(1)创建静态链接库
- MSVC编译器生成的库后缀为“.lib”
- MinGW编译器生成的库后缀为".a"
(2)使用静态库
需要使用静态库文件和h文件,不需要cpp文件
2、实现程序

(1)创建Library项目



(2)使用图表中的一个窗口

(3)创建项目调用库
(4)添加库



(5)实现功能
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogpen.h"#include <QPainter>void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 100, 50); // 逻辑坐标painter.setPen(mPen);painter.drawRect(10, 10, 80, 30);
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actSetPen_triggered()
{bool ok = false;QPen pen = DialogPen::getPen(mPen, ok);if(ok){mPen = pen;repaint();}
}

四、共享库(动态链接库)
1、动态库声明
(1)隐式加载
#if defined(DLL_LIBRARY)
#define DLLSHARED_EXPORT Q_DECL_EXPORT
#else
#define DLLSHARED_EXPORT Q_DECL_IMPORT
#endif
(2)显示加载(直接打开dll库,直接解析调用函数)
typedef int (*FunDef)(int);FunDef myFun = (FunDef)myLib.resolve("funName"); //解析dll函数
int n = myFun(1); //调用函数
2、实现隐式加载程序
(1)创建动态库工程

(2)导出动态库
class SHAREDLIBSHARED_EXPORT DialogPen : public QDialog
(3)实现功能
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogpen.h"#include <QPainter>void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 100, 50); // 逻辑坐标painter.setPen(mPen);painter.drawRect(10, 10, 80, 30);
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actSetPen_triggered()
{bool ok = false;QPen pen = DialogPen::getPen(mPen, ok);if(ok){mPen = pen;repaint();}
}

3、实现显式加载程序
相关文章:
十一、Qt自定义Widget组件、静态库与动态库
一、自定义Widget组件 1、自定义Widget组件 使用步骤采用提升法(promotion)重新定义paintEvent事件 2、实现程序 (1)创建项目,基于QWidget (2)添加类,为Widget组件提升类 #inclu…...
八、ChatGPT能替代什么人?
上一讲关于ChatGPT的热炒,其实对于我们来说算是敲了敲警钟。 其实在今天,关于ChatGPT,最多人关注的一个问题就是:ChatGPT能取代人吗,或者说能抢人的饭碗么吗? 有人说不能,也有人说能(…...
QT C++实现点击按键弹出窗口并显示图片/视频|多窗口应用程序的设计和开发
一、介绍 首先,QT界面开发中主要大体分为2种多窗口的形式: 嵌入式: 新生成的窗口嵌入在主窗口内部独立窗口: 以弹窗形式的新窗口生成和展示 这里就讲解最简单的:点击案件后,跳出一个新窗口 二、代码实…...
shell和go实现:防火墙放行所有端口,唯独拦截80端口
shell 1.防火墙放行所有端口,唯独拦截80端口 1.1拦截 mkdir -p /data/shellscat > /data/shells/02nginx_close.sh <<-EOF #!/bin/bash# 检查Linux系统版本 linux_version$(cat /etc/redhat-release)# 根据Linux系统版本选择相应的防火墙开启命令和保存…...
QT信号槽实现分析
1.宏定义 qt中引入了MOC来反射,编译阶段变成 MOC–>预处理–>编译–>汇编–>链接 1-1、Q_OBJECT 这个宏定义了一系列代码,包括元对象和处理的函数 #define Q_OBJECT \public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static c…...
【pytorch】tensor.detach()和tensor.data的区别
文章目录 序言相同点不同点测试实例应用 序言 .detach()和.data都可以用来分离tensor数据,下面进行比较pytorch0.4及之后的版本,.data仍保留,但建议使用.detach() 相同点 x.detach()和x.data返回和x相同数据的tensor,这个新的t…...
教师资格证相关
文章目录: 一:考试时间 二:考试科目 三:相关网站 四:相关 一:考试时间 教资 笔试 面试笔试报名笔试考试笔试公布面试报名面试时间面试公布上半年1月14日3月12日4月15日4月…...
卷积神经网络介绍
卷积神经网络(Convolutional Neural Networks,CNN) 网络的组件:卷积层,池化层,激活层和全连接层。 CNN主要由以下层构造而成: 卷积层:Convolutional layer(CONV)池化层:…...
XSS简介
XSS被称为跨站脚本攻击(Cross-site scripting),由于和CSS(CascadingStyle Sheets)重名,所以改为XSS。 XSS主要速于javascript语言完成恶意的攻击行为,因为javascript可非常灵活的操作html、css和浏览器 XSS就是指通过利用网页开发时留下的漏…...
手写redux和applyMiddleware中间件react示例
目录 一 核心代码 1.reducer 2.store.js 二 关于context API的使用 1. MyContext 2. createContext 3. ContextProvider 4. connect 三 组件验证效果 1. Todo 2. TodoList 3.TodoItem 4.TodoInput 5. App组件引入Todo组件 一 核心代码 1.reducer // 新增列表数…...
MATLAB R2024a 主要更新内容
系列文章目录 前言 一、主要更新 计算机视觉工具箱 —— 为二维和三维视觉任务设计算法、标注数据并生成代码。深度学习工具箱 —— 支持变换器等架构;导入并共同模拟 PyTorch 和 TensorFlow 模型。仪器控制工具箱 —— 使用仪器资源管理器应用程序管理带有 IVI 和…...
4.1.CVAT——目标检测的标注详细步骤
文章目录 1. 进入任务1. 创建任务2. 已创建的task3. 进入标注界面 2. 选择标注类型2.1 选择标注类型2.2 进行标注2.3 遮挡 2.快捷键3.导出标注结果 1. 进入任务 登录后会看到如下图界面,CVAT的标注最小单位是Task,每个Task为一个标注任务。点击Task按钮…...
图论-算法题
797. 所有可能的路径 题目: 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i …...
onnx 1.16 doc学习笔记七:python API一览
onnx作为一个通用格式,很少有中文教程,因此开一篇文章对onnx 1.16文档进行翻译与进一步解释, onnx 1.16官方文档:https://onnx.ai/onnx/intro/index.html](https://onnx.ai/onnx/intro/index.html), 如果觉得有收获&am…...
LACP——链路聚合控制协议
LACP——链路聚合控制协议 什么是LACP? LACP(Link Aggregation Control Protocol,链路聚合控制协议)是一种基于IEEE802.3ad标准的实现链路动态聚合与解聚合的协议,它是链路聚合中常用的一种协议。 链路聚合组中启用了…...
终端启动jupyter notebook更换端口
一、问题描述 如果尝试在端口 8889 上启动 Jupyter Notebook 但最终启动在了 8890 端口,这通常意味着 8889 端口已经被占用。要解决这个问题,可以尝试以下几种方法来关闭占用 8889 端口的进程。 1. 查找并终止占用端口的进程 首先,需要找出…...
IT发布管理,轻松部署软件
我们带来了一项令人振奋的好消息,可有效缓解构建的质量相对劣质和发布的速度相对缓慢。 ManageEngine卓豪推出了ServiceDesk Plus MSP中的IT发布管理,配备了可视化的工作流程,这是PSA-ITSM解决方案的一部分。有了这个新功能,您可以…...
2024国际生物发酵展览会独家解读-力诺天晟科技
参展企业介绍 北京力诺天晟科技有限公司,专业致力于智能仪器仪表制造,工业自动控制系统用传感器、变送器的研发、设计、销售和服务。 公司坐落于首都北京行政副中心-通州区,下设生产子公司位于河北香河经济开发区,厂房面积 300…...
YOLOv9尝鲜测试五分钟极简配置
pip安装python包: pip install yolov9pip在https://github.com/WongKinYiu/yolov9/tree/main中下载好权重文件yolov9-c.pt。 运行下面代码: import yolov9model yolov9.load("yolov9-c.pt", device"cpu") # load pretrained or c…...
消息中间件篇之Kafka-消息不丢失
一、 正常工作流程 生产者发送消息到kafka集群,然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…...
ISIS和OSPF到底有啥区别?用5台路由器搭建实验环境,一次给你讲清楚
ISIS与OSPF深度对比:五节点实验环境下的协议差异全景解析 当网络规模突破某个临界点,静态路由的手工维护成本会呈指数级增长。我在运营商核心网改造项目中第一次接触ISIS时,也曾困惑:为什么放着成熟的OSPF不用,非要选择…...
从VGA到8K:一文读懂HDMI协议进化史与关键版本差异(1.4/2.0/2.1对比)
从VGA到8K:HDMI协议进化史与关键版本差异全解析 2002年12月,当索尼、松下、东芝等七家电子巨头联合发布HDMI 1.0标准时,很少有人能预料到这个接口会在未来二十年彻底改变视听产业的格局。如今,从家庭影院到电竞显示器,…...
省级面板数据避坑指南:统计局2500指标的真实使用场景解析
省级面板数据实战解析:能源财政指标的深度验证与陷阱规避 当面对涵盖2500指标的省级面板数据时,智库研究员和政策分析师常常陷入两难:一方面欣喜于数据的丰富性,另一方面又担忧数据质量对研究结论的影响。特别是在能源转型和财政政…...
别再死记硬背了!用生活中的例子帮你彻底搞懂HFSS边界条件(理想E/H、阻抗、集总RLC)
用厨房电器和家具秒懂HFSS边界条件:硬件工程师的生存指南 刚接触HFSS时,那些边界条件总让我想起第一次进高端厨房的体验——面对各种看不懂的按钮和术语,连最简单的煮鸡蛋都可能搞砸。就像电磁仿真中,选错一个边界条件,…...
5分钟快速上手:Windows风扇控制软件FanControl完全指南
5分钟快速上手:Windows风扇控制软件FanControl完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...
3分钟完成Windows Defender永久禁用:开源控制工具终极指南
3分钟完成Windows Defender永久禁用:开源控制工具终极指南 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-control …...
如何快速自动化获取和安装Boot Camp驱动:Brigadier终极指南
如何快速自动化获取和安装Boot Camp驱动:Brigadier终极指南 【免费下载链接】brigadier Fetch and install Boot Camp ESDs with ease. 项目地址: https://gitcode.com/gh_mirrors/bri/brigadier Brigadier是一款跨平台智能驱动管理工具,专为Mac设…...
DownKyi哔哩下载姬:如何轻松保存B站8K高清视频的完整指南
DownKyi哔哩下载姬:如何轻松保存B站8K高清视频的完整指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&am…...
Windows 10 下 Node.js 16.15.1 保姆级安装与环境变量配置(含 npm 报错解决)
Windows 10 下 Node.js 16.15.1 完整安装与深度配置指南 对于刚接触 Node.js 开发的 Windows 用户来说,从零开始搭建开发环境往往会遇到各种"坑"。本文将带你一步步完成 Node.js 16.15.1 LTS 版本的安装、环境变量配置以及常见问题的解决方案,…...
C++20标准中的范围(Ranges)库:功能与应用概览
C20标准中的范围(Ranges)库:功能与应用概览 引言 C作为一门历史悠久且广泛应用的编程语言,其标准库不断演进以满足现代编程的需求。C20标准引入了一个重要的新特性——范围(Ranges)库,它为处理序…...
