Qt基于QWidget打造网速小部件SpeedMeterWidget

news/2025/2/19 13:20:56/文章来源:https://www.cnblogs.com/pandamohist/p/18716271

目标

  • 基于QWidget自定义网速小部件
  • 支持设置上行和下行方向
  • 支持自定义设置网速显示数值和单位
  • 支持动态设置上行和下行颜色

效果图

控件完整代码

SpeedMeterWidget.h

#pragma once#include <QWidget>
#include <QPainter>
class QPaintEvent;/// 
/// @brief: 速度仪表控件, 由箭头+文本组成, 并分别在箭头后紧跟文字,箭头朝向分为上下。同时只能显示其中的一种方向(朝上或者朝下)
/// 
class SpeedMeterWidget  : public QWidget
{Q_OBJECTpublic:enum ARROW_OPTION{/// 箭头方向-向上AO_UP = 1,/// 箭头方向-向下AO_DOWN = 2,};public:explicit SpeedMeterWidget(QWidget *parent = nullptr);virtual ~SpeedMeterWidget();///// ///// @brief:	设置背景色///// @param: const QString & str /////  @ret:	void/////				//void setBackgroundColor(const QString& str);/// /// @brief:	设置箭头朝向/// @param: const ARROW_OPTION ao ///  @ret:	void///				void setArrowOption(const ARROW_OPTION ao);/// /// @brief:	设置箭头填充颜色, 颜色,比如 "#FF00FF" /// @param: const QString & str ///  @ret:	void///				void setArrowFillColor(const QString& str);/// /// @brief:	设置显示的文本/// @param: const QString & text ///  @ret:	void///				void setSpeedText(const QString& text);/// /// @brief:	设置显示的文本的颜色/// @param: const QString & str, 颜色,比如 "#FF00FF" ///  @ret:	void///				void setSpeedTextColor(const QString& str);/// /// @brief:	设置显示的文本大小/// @param: const int size ///  @ret:	void///				void setSpeedTextPointSize(const int size);private:void paintEvent(QPaintEvent* event);/// /// @brief:	绘制箭头/// @param: QPainter & painter ///  @ret:	void///				void drawArrow(QPainter& painter, const QRectF& contentRect);/// /// @brief:	绘制自定义文字/// @param: QPainter & painter /// @param: const QRectF & contentRect ///  @ret:	void///				void drawText(QPainter& painter, const QRectF& contentRect);private:struct PainterHelper;///// 背景色//QString			m_backgroundColor{"#E8E8EC"};/// 箭头方向ARROW_OPTION	m_arrowOption{AO_DOWN};/// 箭头的填充颜色QString			m_arrowFillColor{"#2AEBA2"};/// 显示的文字内容QString			m_speedText{"777.0kb/s"};/// 显示的文字的颜色QString			m_speedTextColor{ "#5D6B99" };/// 文字的大小int				m_speedTextPointSize{10};
};

SpeedMeterWidget.cpp

#include "SpeedMeterWidget.h"struct SpeedMeterWidget::PainterHelper
{PainterHelper(QPainter& p) : m_painter(p){m_painter.save();}virtual ~PainterHelper(){m_painter.restore();}private:QPainter& m_painter;
};SpeedMeterWidget::SpeedMeterWidget(QWidget *parent): QWidget(parent)
{setWindowFlags(Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);
}SpeedMeterWidget::~SpeedMeterWidget()
{}
//
///// 
///// @brief:	setBackgroundColor
///// @param: const QString & str - 
/////  @ret:	void
/////				
//void SpeedMeterWidget::setBackgroundColor(const QString& str)
//{
//	m_backgroundColor = str;
//	update();
//}/// 
/// @brief:	setArrowOption
/// @param: const ARROW_OPTION ao - 
///  @ret:	void
///				
void SpeedMeterWidget::setArrowOption(const ARROW_OPTION ao)
{m_arrowOption = ao;update();
}/// 
/// @brief:	setArrowFillColor
/// @param: const QString & str - 
///  @ret:	void
///				
void SpeedMeterWidget::setArrowFillColor(const QString& str)
{m_arrowFillColor = str;update();
}/// 
/// @brief:	setSpeedText
/// @param: const QString & text - 
///  @ret:	void
///				
void SpeedMeterWidget::setSpeedText(const QString& text)
{m_speedText = text;update();
}/// 
/// @brief:	setSpeedTextColor
/// @param: const QString & str - 
///  @ret:	void
///				
void SpeedMeterWidget::setSpeedTextColor(const QString& str)
{m_speedTextColor = str;update();
}/// 
/// @brief:	setSpeedTextPointSize
/// @param: const int size - 
///  @ret:	void
///				
void SpeedMeterWidget::setSpeedTextPointSize(const int size)
{m_speedTextPointSize = size;update();
}/// 
/// @brief:	paintEvent
/// @param: QPaintEvent * event - 
///  @ret:	void
///				
void SpeedMeterWidget::paintEvent(QPaintEvent* event)
{if (false == isVisible()){return;}QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);qreal ww = width() * 1.0;qreal hh = height() * 1.0;//painter.scale(ww / 200, hh / 200);painter.setPen(Qt::NoPen);/// 绘制背景色//painter.setBrush(QColor(m_backgroundColor));//painter.drawRect(this->rect());const QRectF contentRect = QRectF(0, 1, ww, hh - 2);/// 绘制背景色drawArrow(painter, contentRect);/// 绘制文本drawText(painter, contentRect);}/// 
/// @brief:	drawArrow
/// @param: QPainter & painter - 
///  @ret:	void
///				
void SpeedMeterWidget::drawArrow(QPainter& painter, const QRectF& contentRect)
{PainterHelper ph(painter);painter.setPen(QColor(m_arrowFillColor));painter.setBrush(QColor(m_arrowFillColor));/// 箭头的组成, 三角形 + 矩形。 三角形和矩形的高度各占控件高度的一半/// 箭头的宽度占控件整体宽度的1/4QRectF arrowRect = contentRect;arrowRect.setWidth(contentRect.width() / 4.0);/// 移动到箭头的中间painter.translate(arrowRect.center());qreal ww = arrowRect.width();qreal hh = arrowRect.height();/// 三角形{/// 用于确定箭头朝向, 1.0标识箭头朝上qreal valueFlag = 1.0;if (AO_DOWN == m_arrowOption){valueFlag = -1.0;}QPointF arrTmp[] = {QPointF(-ww / 2 , 0),QPointF(ww / 2, 0),QPointF(0, -hh / 2 * valueFlag)};painter.drawPolygon(arrTmp, 3);}/// 矩形{qreal rectW = ww / 3;qreal rectH = hh / 2;qreal rectY = 0;if (AO_DOWN == m_arrowOption){rectY = -rectH;}/// 矩形与三角形相邻的边长=箭头区域宽度的一半painter.drawRect(-rectW / 2, rectY, rectW, rectH);}
}/// 
/// @brief:	绘制自定义文字
/// @param: QPainter & painter - 
/// @param: const QRectF & contentRect - 
///  @ret:	void
///				
void SpeedMeterWidget::drawText(QPainter& painter, const QRectF& contentRect)
{PainterHelper ph(painter);painter.setPen(QPen(QColor(m_speedTextColor)));painter.setBrush(Qt::NoBrush);QFont fontTmp = painter.font();fontTmp.setPointSize(m_speedTextPointSize);painter.setFont(fontTmp);/// 文字占整个控件的3/4 宽QRectF textRect = contentRect;qreal tmpW = contentRect.width();textRect.setX(contentRect.x() + contentRect.width() / 4.0);textRect.setWidth(tmpW * 3.0 /4.0);painter.drawText(textRect, Qt::AlignCenter, m_speedText);
}

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

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

相关文章

Qt基于QWidget实现倒计时控件CircleCountDownBar

目标基于Qwidget实现圆弧倒计时 可自定义圆弧内部显示的文字 可设定当前圆弧的进度效果图完整控件代码 CircleCountDownBar.h #pragma once#include <QWidget> class QPaiter; class QPaintEvent;class CircleCountDownBar : public QWidget {Q_OBJECTpublic:CircleCount…

初学者的量化 “利器”,哪种策略才是你的菜?

初学者量化投资别迷茫!中低频策略为何优选?快来解锁适合拟的量化“利器”策略更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 写在前面 这篇文章专为量化投资领域的小白精心打造,量化大神们请自动略过哦。 本文将从中低频交易方…

Qt实现速度仪表盘GaugeSpeedWidget

目标基于QWidget绘制速度仪表盘, 仪表盘颜色为渐变色, 可指定当前显示的文字内容和文字颜色 可指定当前指针旋转的数值效果图控件完整代码 GaugeSpeedWidget.h #pragma once#include <QWidget> #include <QMap>class QPaintEvent; class QPainter;/// /// @brie…

pcie报文

PCIE的四种请求memory、IO的地址编码posted、no-postedTLP包类型缩写MRD举例TLP包格式TLP HEADTLP HEAD byte0memory操作

P1107 [BJWC2008] 雷涛的小猫

链接 https://www.luogu.com.cn/problem/P1107 题目思路因为在取h+delta的max时会一直遍历,所以直接加个记忆,就不用一直遍历了。 代码 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<queue> #include<cmath> #in…

PVE8.3.1开启核显虚拟化SR-IOV

本来想集成到前面的文章,但是被网上一些文章误导从而浪费了3H之后决定还是单开一篇专门说说PVE8.3.1开启核显虚拟化的过程。所以建议大家还是参考更有价值的唯一的官方指南 https://github.com/strongtz/i915-sriov-dkms 交代一下背景: 发文日期2025年2月14日,以下所有操作均…

【C】单链表

单链表 声明一个指向自身的结构体 struct Test {int x;int y;struct Test test; };输出结果: error!程序报错,因为这样会造成无限的循环。当编译器解析到struct Test test时test是结构体Test的成员,定义test成员需要Test,而结构体Test自身又是不完整的,那么程序就无法定义一…

所有Ollama用户请注意!!!你的IP可能已泄露

刚刚学到一项非常硬核的“黑”科技,只要几个关键词,就能实现 Ollama 自由。全世界几万台高性能带显卡的电脑供你使用。 添加图片注释,不超过 140 字(可选)看看这个页面,美国,中国,德国,英国....一个独立 IP 背后就是一台电脑,有些可能还是服务器。我实测了,随便找一…

【C】内存布局

动态内存管理 动态内存管理的几个函数malloc -- 申请动态内存空间 free -- 释放动态内存空间 calloc -- 申请并初始化一系列内存空间 realloc -- 重新分配内存空间malloc函数原型:void *malloc(size_t size);malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块…

【C】指针

指针 变量在内存中的存放 在内存中,字节是最小的存储单元。对于一个内存单元来说,指针就是单元的地址,每个地址可以存放一个字节的数据。存放一个整形变量(int)就需要动用到四个存储单元。 在内存中完全没有存储变量名的必要。 因为编译器知道具体每一个变量名对应的存放地址…

VMwareWorkstation pro 17下载与安装

‌VMware Workstation Pro 17‌是一款功能强大的虚拟机软件,专为开发者和IT专业人士设计。它允许用户在一台物理计算机上创建和运行多个虚拟操作系统,从而实现跨平台的开发、测试和部署。VMware Workstation Pro 17采用了先进的虚拟化技术,能够在单个物理主机上运行多个虚拟…

我的“ DeepSeek 越来越闲了”!讯飞星火无限调用 API 攻略来了

最近DeepSeek 确实挺忙,网页繁忙,API资源紧张。 添加图片注释,不超过 140 字(可选) 开源模型也很忙,被下载了 267万次!!! 添加图片注释,不超过 140 字(可选) 但是,我的 DeepSeek 要越来越闲了。腾讯云的接口刚用上,讯飞星火的又来了。 添加图片注释,不超过 1…