Qt项目实战:红绿灯小程序

目录

一.初始化对象

二.捕获并处理特定的事件

三.自定义绘制方法

四.绘制外部边框

五.绘制内部边框

六.绘制按钮的背景色

七.绘制覆盖层(高光效果)

八.效果

九.代码

1.h

2.cpp


一.初始化对象

1.设置文本、颜色、边框和背景色等默认值。

2.安装事件过滤器以捕获鼠标事件。

3.创建定时器 timerAlarm 用于处理报警状态,并连接到槽函数 alarm()

二.捕获并处理特定的事件

1.当检测到鼠标按下事件时,如果点击在按钮范围内,则记录当前点并设置 pressed = true

2.如果正在拖动按钮且允许移动,则更新按钮的位置。

3.当鼠标释放时,重置 pressed 状态并发出点击信号 (clicked())。

三.自定义绘制方法

1.根据 showRect 的值决定绘制矩形或其他图形元素(如边框、背景、文字等)。

2.使用抗锯齿技术提高绘制质量。

四.绘制外部边框

使用线性渐变填充颜色绘制圆形边框,分别为外层和内层

五.绘制内部边框

六.绘制按钮的背景色

绘制一个圆形作为背景,使用设置好的背景颜色填充

七.绘制覆盖层(高光效果)

如果启用遮罩层,则根据指定半径绘制小圆圈和大圆圈形成高光效果,并应用渐变色填充。

八.效果

九.代码

1.h

#ifndef LIGHTBUTTON_H
#define LIGHTBUTTON_H
#include <QWidget>#ifdef quc
class Q_DECL_EXPORT LightButton : public QWidget
#else
class LightButton : public QWidget
#endif{Q_OBJECTQ_PROPERTY(QString text READ getText WRITE setText)Q_PROPERTY(QColor textColor READ getTextColor WRITE setTextColor)Q_PROPERTY(QColor alarmColor READ getAlarmColor WRITE setAlarmColor)Q_PROPERTY(QColor normalColor READ getNormalColor WRITE setNormalColor)Q_PROPERTY(QColor borderOutColorStart READ getBorderOutColorStart WRITE setBorderOutColorStart)Q_PROPERTY(QColor borderOutColorEnd READ getBorderOutColorEnd WRITE setBorderOutColorEnd)Q_PROPERTY(QColor borderInColorStart READ getBorderInColorStart WRITE setBorderInColorStart)Q_PROPERTY(QColor borderInColorEnd READ getBorderInColorEnd WRITE setBorderInColorEnd)Q_PROPERTY(QColor bgColor READ getBgColor WRITE setBgColor)Q_PROPERTY(bool canMove READ getCanMove WRITE setCanMove)Q_PROPERTY(bool showRect READ getShowRect WRITE setShowRect)Q_PROPERTY(bool showOverlay READ getShowOverlay WRITE setShowOverlay)Q_PROPERTY(QColor overlayColor READ getOverlayColor WRITE setOverlayColor)public:explicit LightButton(QWidget *parent = 0);protected:bool eventFilter(QObject *watched, QEvent *event);void paintEvent(QPaintEvent *);void drawBorderOut(QPainter *painter);void drawBorderIn(QPainter *painter);void drawBg(QPainter *painter);void drawText(QPainter *painter);void drawOverlay(QPainter *painter);private:QString text;               //文本QColor textColor;           //文字颜色QColor alarmColor;          //报警颜色QColor normalColor;         //正常颜色QColor borderOutColorStart; //外边框渐变开始颜色QColor borderOutColorEnd;   //外边框渐变结束颜色QColor borderInColorStart;  //里边框渐变开始颜色QColor borderInColorEnd;    //里边框渐变结束颜色QColor bgColor;             //背景颜色bool showRect;              //显示成矩形bool canMove;               //是否能够移动bool showOverlay;           //是否显示遮罩层QColor overlayColor;        //遮罩层颜色bool pressed;               //鼠标是否按下QPoint lastPoint;           //鼠标最后按下坐标bool isAlarm;               //是否报警QTimer *timerAlarm;         //定时器切换颜色public://默认尺寸和最小尺寸QSize sizeHint() const;QSize minimumSizeHint() const;//获取和设置文本QString getText() const;void setText(const QString &text);//获取和设置文本颜色QColor getTextColor() const;void setTextColor(const QColor &textColor);//获取和设置报警颜色QColor getAlarmColor() const;void setAlarmColor(const QColor &alarmColor);//获取和设置正常颜色QColor getNormalColor() const;void setNormalColor(const QColor &normalColor);//获取和设置外边框渐变颜色QColor getBorderOutColorStart() const;void setBorderOutColorStart(const QColor &borderOutColorStart);QColor getBorderOutColorEnd() const;void setBorderOutColorEnd(const QColor &borderOutColorEnd);//获取和设置里边框渐变颜色QColor getBorderInColorStart() const;void setBorderInColorStart(const QColor &borderInColorStart);QColor getBorderInColorEnd() const;void setBorderInColorEnd(const QColor &borderInColorEnd);//获取和设置背景色QColor getBgColor() const;void setBgColor(const QColor &bgColor);//获取和设置是否可移动bool getCanMove() const;void setCanMove(bool canMove);//获取和设置是否显示矩形bool getShowRect() const;void setShowRect(bool showRect);//获取和设置是否显示遮罩层bool getShowOverlay() const;void setShowOverlay(bool showOverlay);//获取和设置遮罩层颜色QColor getOverlayColor() const;void setOverlayColor(const QColor &overlayColor);public Q_SLOTS://设置为绿色void setGreen();//设置为红色void setRed();//设置为黄色void setYellow();//设置为黑色void setBlack();//设置为灰色void setGray();//设置为蓝色void setBlue();//设置为淡蓝色void setLightBlue();//设置为淡红色void setLightRed();//设置为淡绿色void setLightGreen();//设置报警闪烁void startAlarm();void stopAlarm();void alarm();Q_SIGNALS://单击信号void clicked();
};#endif // LIGHTBUTTON_H

2.cpp

#pragma execution_character_set("utf-8")#include "lightbutton.h"
#include "qpainter.h"
#include "qpainterpath.h"
#include "qevent.h"
#include "qtimer.h"LightButton::LightButton(QWidget *parent) : QWidget(parent)
{text = "";textColor = QColor(255, 255, 255);alarmColor = QColor(255, 107, 107);normalColor = QColor(10, 10, 10);borderOutColorStart = QColor(255, 255, 255);borderOutColorEnd = QColor(166, 166, 166);borderInColorStart = QColor(166, 166, 166);borderInColorEnd = QColor(255, 255, 255);bgColor = QColor(100, 184, 255);showRect = false;showOverlay = true;overlayColor = QColor(255, 255, 255);canMove = false;pressed = false;this->installEventFilter(this);isAlarm = false;timerAlarm = new QTimer(this);connect(timerAlarm, SIGNAL(timeout()), this, SLOT(alarm()));timerAlarm->setInterval(500);
}bool LightButton::eventFilter(QObject *watched, QEvent *event)
{int type = event->type();QMouseEvent *mouseEvent = (QMouseEvent *)event;if (type == QEvent::MouseButtonPress) {if (this->rect().contains(mouseEvent->pos()) && (mouseEvent->button() == Qt::LeftButton)) {lastPoint = mouseEvent->pos();pressed = true;}} else if (type == QEvent::MouseMove && pressed) {if (canMove) {int dx = mouseEvent->pos().x() - lastPoint.x();int dy = mouseEvent->pos().y() - lastPoint.y();this->move(this->x() + dx, this->y() + dy);}} else if (type == QEvent::MouseButtonRelease && pressed) {pressed = false;Q_EMIT clicked();}return QWidget::eventFilter(watched, event);
}void LightButton::paintEvent(QPaintEvent *)
{int width = this->width();int height = this->height();int side = qMin(width, height);//绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);if (showRect) {//绘制矩形区域painter.setPen(Qt::NoPen);painter.setBrush(bgColor);painter.drawRoundedRect(this->rect(), 5, 5);//绘制文字if (!text.isEmpty()) {QFont font;font.setPixelSize(side - 20);painter.setFont(font);painter.setPen(textColor);painter.drawText(this->rect(), Qt::AlignCenter, text);}} else {painter.translate(width / 2, height / 2);painter.scale(side / 200.0, side / 200.0);//绘制外边框drawBorderOut(&painter);//绘制内边框drawBorderIn(&painter);//绘制内部指示颜色drawBg(&painter);//绘制居中文字drawText(&painter);//绘制遮罩层drawOverlay(&painter);}
}void LightButton::drawBorderOut(QPainter *painter)
{int radius = 99;painter->save();painter->setPen(Qt::NoPen);QLinearGradient borderGradient(0, -radius, 0, radius);borderGradient.setColorAt(0, borderOutColorStart);borderGradient.setColorAt(1, borderOutColorEnd);painter->setBrush(borderGradient);painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);painter->restore();
}void LightButton::drawBorderIn(QPainter *painter)
{int radius = 90;painter->save();painter->setPen(Qt::NoPen);QLinearGradient borderGradient(0, -radius, 0, radius);borderGradient.setColorAt(0, borderInColorStart);borderGradient.setColorAt(1, borderInColorEnd);painter->setBrush(borderGradient);painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);painter->restore();
}void LightButton::drawBg(QPainter *painter)
{int radius = 80;painter->save();painter->setPen(Qt::NoPen);painter->setBrush(bgColor);painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);painter->restore();
}void LightButton::drawText(QPainter *painter)
{if (text.isEmpty()) {return;}int radius = 100;painter->save();QFont font;font.setPixelSize(85);painter->setFont(font);painter->setPen(textColor);QRect rect(-radius, -radius, radius * 2, radius * 2);painter->drawText(rect, Qt::AlignCenter, text);painter->restore();
}void LightButton::drawOverlay(QPainter *painter)
{if (!showOverlay) {return;}int radius = 80;painter->save();painter->setPen(Qt::NoPen);QPainterPath smallCircle;QPainterPath bigCircle;radius -= 1;smallCircle.addEllipse(-radius, -radius, radius * 2, radius * 2);radius *= 2;bigCircle.addEllipse(-radius, -radius + 140, radius * 2, radius * 2);//高光的形状为小圆扣掉大圆的部分QPainterPath highlight = smallCircle - bigCircle;QLinearGradient linearGradient(0, -radius / 2, 0, 0);overlayColor.setAlpha(100);linearGradient.setColorAt(0.0, overlayColor);overlayColor.setAlpha(30);linearGradient.setColorAt(1.0, overlayColor);painter->setBrush(linearGradient);painter->rotate(-20);painter->drawPath(highlight);painter->restore();
}QSize LightButton::sizeHint() const
{return QSize(100, 100);
}QSize LightButton::minimumSizeHint() const
{return QSize(10, 10);
}QString LightButton::getText() const
{return this->text;
}void LightButton::setText(const QString &text)
{if (this->text != text) {this->text = text;this->update();}
}QColor LightButton::getTextColor() const
{return this->textColor;
}void LightButton::setTextColor(const QColor &textColor)
{if (this->textColor != textColor) {this->textColor = textColor;this->update();}
}QColor LightButton::getAlarmColor() const
{return this->alarmColor;
}void LightButton::setAlarmColor(const QColor &alarmColor)
{if (this->alarmColor != alarmColor) {this->alarmColor = alarmColor;this->update();}
}QColor LightButton::getNormalColor() const
{return this->normalColor;
}void LightButton::setNormalColor(const QColor &normalColor)
{if (this->normalColor != normalColor) {this->normalColor = normalColor;this->update();}
}QColor LightButton::getBorderOutColorStart() const
{return this->borderOutColorStart;
}void LightButton::setBorderOutColorStart(const QColor &borderOutColorStart)
{if (this->borderOutColorStart != borderOutColorStart) {this->borderOutColorStart = borderOutColorStart;this->update();}
}QColor LightButton::getBorderOutColorEnd() const
{return this->borderOutColorEnd;
}void LightButton::setBorderOutColorEnd(const QColor &borderOutColorEnd)
{if (this->borderOutColorEnd != borderOutColorEnd) {this->borderOutColorEnd = borderOutColorEnd;this->update();}
}QColor LightButton::getBorderInColorStart() const
{return this->borderInColorStart;
}void LightButton::setBorderInColorStart(const QColor &borderInColorStart)
{if (this->borderInColorStart != borderInColorStart) {this->borderInColorStart = borderInColorStart;this->update();}
}QColor LightButton::getBorderInColorEnd() const
{return this->borderInColorEnd;
}void LightButton::setBorderInColorEnd(const QColor &borderInColorEnd)
{if (this->borderInColorEnd != borderInColorEnd) {this->borderInColorEnd = borderInColorEnd;this->update();}
}QColor LightButton::getBgColor() const
{return this->bgColor;
}void LightButton::setBgColor(const QColor &bgColor)
{if (this->bgColor != bgColor) {this->bgColor = bgColor;this->update();}
}bool LightButton::getCanMove() const
{return this->canMove;
}void LightButton::setCanMove(bool canMove)
{if (this->canMove != canMove) {this->canMove = canMove;this->update();}
}bool LightButton::getShowRect() const
{return this->showRect;
}void LightButton::setShowRect(bool showRect)
{if (this->showRect != showRect) {this->showRect = showRect;this->update();}
}bool LightButton::getShowOverlay() const
{return this->showOverlay;
}void LightButton::setShowOverlay(bool showOverlay)
{if (this->showOverlay != showOverlay) {this->showOverlay = showOverlay;this->update();}
}QColor LightButton::getOverlayColor() const
{return this->overlayColor;
}void LightButton::setOverlayColor(const QColor &overlayColor)
{if (this->overlayColor != overlayColor) {this->overlayColor = overlayColor;this->update();}
}void LightButton::setGreen()
{textColor = QColor(255, 255, 255);setBgColor(QColor(0, 166, 0));
}void LightButton::setRed()
{textColor = QColor(255, 255, 255);setBgColor(QColor(255, 0, 0));
}void LightButton::setYellow()
{textColor = QColor(25, 50, 7);setBgColor(QColor(238, 238, 0));
}void LightButton::setBlack()
{textColor = QColor(255, 255, 255);setBgColor(QColor(10, 10, 10));
}void LightButton::setGray()
{textColor = QColor(255, 255, 255);setBgColor(QColor(129, 129, 129));
}void LightButton::setBlue()
{textColor = QColor(255, 255, 255);setBgColor(QColor(0, 0, 166));
}void LightButton::setLightBlue()
{textColor = QColor(255, 255, 255);setBgColor(QColor(100, 184, 255));
}void LightButton::setLightRed()
{textColor = QColor(255, 255, 255);setBgColor(QColor(255, 107, 107));
}void LightButton::setLightGreen()
{textColor = QColor(255, 255, 255);setBgColor(QColor(24, 189, 155));
}void LightButton::startAlarm()
{if (!timerAlarm->isActive()) {timerAlarm->start();}
}void LightButton::stopAlarm()
{if (timerAlarm->isActive()) {timerAlarm->stop();}
}void LightButton::alarm()
{if (isAlarm) {textColor = QColor(255, 255, 255);bgColor = normalColor;} else {textColor = QColor(255, 255, 255);bgColor = alarmColor;}this->update();isAlarm = !isAlarm;
}

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

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

相关文章

408——计算机网络(持续更新)

文章目录 一、计算机网络概述1.1 计算机网络的概念1.2 计算机网络体系结构1.3 总结 二、物理层2.1 物理层的基本概念2.2 物理层的基本通信技术2.3 总结 一、计算机网络概述 1.1 计算机网络的概念 计算机网络的定义&#xff1a;将地理位置不同的具有独立功能的计算机通过网络线路…

算法简介:K最近邻算法

KNN 1. 最近邻算法1.1 回归 2. 机器学习OCR创建垃圾邮件过滤器预测股票市场 1. 最近邻算法 KNN&#xff08;k-nearest neighbours&#xff09;K最近邻算法&#xff1a;采用此算法进行分类&#xff0c;检索距离该元素最近的几个元素是什么类型&#xff0c;那么该元素即为什么类…

力扣动态规划基础版(矩阵型)

62.不同路径&#xff08;唯一路径问题&#xff09; 62. 不同路径https://leetcode.cn/problems/unique-paths/ 方法一&#xff1a;动态规划 找状态转移方程&#xff0c;也就是说它从左上角走到右下角&#xff0c;只能往右或者往下走&#xff0c;那么设置一个位置为&#xff…

adb 常用命令汇总

目录 adb 常用命令 1、显示已连接的设备列表 2、进入设备 3、安装 APK 文件到设备 4、卸载指定包名的应用 5、从设备中复制文件到本地 6、将本地文件复制到设备 7、查看设备日志信息 8、重启设备 9、截取设备屏幕截图 10、屏幕分辨率 11、屏幕密度 12、显示设备的…

基于大语言模型(LLM)自主Agent 智能体综述

近年来,LLM(Large Language Model)取得了显著成功,并显示出了达到人类智能的巨大潜力。基于这种能力,使用LLM作为中央控制器来构建自助Agent,以获得类人决策能力。 Autonomous agents 又被称为智能体、Agent。指能够通过感知周围环境、进行规划以及执行动作来完成既定任务。…

node.js模块化分析

什么是Node.js模块化 Node.js中的模块化‌是指将一个大文件拆分成独立且相互依赖的多个小模块。每个JS文件被视为一个独立的模块&#xff0c;模块之间是互相不可见的。如果一个模块需要使用另一个模块&#xff0c;则需要使用指定的语法来引入该模块&#xff0c;并且只能使用模块…

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…

C语言 -- qsort的简单使用

qsort函数 一、介绍二、语法格式三、使用函数从小到大从大到小 四、结语 一、介绍 qsort 函数是 C 标准库中的一个通用排序函数&#xff0c;用于对数组进行快速排序。它定义在 <stdlib.h> 头文件中。这个非常灵活&#xff0c;因为它允许用户指定数组的元素类型、数组的大…

unity3d————叉乘的知识点

一、向量叉乘的知识点 定义与公式&#xff1a; 向量叉乘的定义为&#xff1a;对于两个三维向量a和b&#xff0c;它们的叉乘结果是一个向量c&#xff0c;记为cab。叉乘的计算公式为&#xff1a;c(y1z2-y2z1)i(x2z1-x1z2)j(x1y2-x2y1)k&#xff0c;其中a(x1, y1, z1)&#xff0c;…

vue2和vue3在html中引用组件component方式不一样

我的vue版本是&#xff1a;20.17.0 一、在HTML中&#xff0c;引用组件格式区别。 vue2引用组件可以是file.vue格式&#xff0c;需要导入&#xff1a;<script src"https://unpkg.com/http-vue-loader"></script>才可以识别vue格式。 vue3引用组件格式是…

密码学知识点整理一:密码学概论

密码学是什么&#xff1f; 密码学是一门研究编制密码和破译密码的技术科学。 密码学&#xff0c;作为信息安全的核心技术之一&#xff0c;其重要性在于能够为信息传输提供安全保障&#xff0c;确保数据在存储或传输过程中的机密性、完整性与真实性不被破坏。从古至今&#x…

我谈正态分布——正态偏态

目录 pdf和cdf参数 标准正态分布期望和方差分布形态 3 σ 3\sigma 3σ原则 正态和偏态正态偏态瑞利分布偏度 (Skewness)峰度 (Kurtosis) 比较 正态分布的英文是Normal Distribution&#xff0c;normal是“正常”或“标准”的意思&#xff0c;中文翻译是正态&#xff0c;多完美的…

杨传辉:云+AI 时代的一体化数据库|OceanBase发布会实录

在 2024 OceanBase 年度发布会 上&#xff0c; OceanBase CTO 杨传辉进行了主题为《云和 AI 时代的一体化数据库战略思考》的演讲&#xff0c;本文为演讲实录&#xff0c;欢迎阅读。 视频观看可点击&#xff1a;https://www.oceanbase.com/video/9001825 各位 OceanBase 的客…

华为OD机试 - 无重复字符的元素长度乘积的最大值(Python/JS/C/C++ 2024 C卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看

文章目录 1.使用 Python 中的 json 库2. 使用浏览器3. notepad4. VSCode 如果COCO的JSON文件内容在一行显示&#xff0c;这通常意味着文件被压缩或者是在传输过程中出现了问题。 1.使用 Python 中的 json 库 想更好地查看 COCO 格式的 JSON 标签&#xff0c;可以将其格式化为更…

2025生物发酵展(济南)为生物制造产业注入新活力共谱行业新篇章

2025第十四届国际生物发酵展将于3月3-5日济南盛大举办&#xff01;产业链逐步完整&#xff0c;展会面积再创历史新高&#xff0c;展览面积较上届增涨至60000平方米&#xff0c;专业观众40000&#xff0c;品牌展商800&#xff0c;同期活动会议增加至50场&#xff0c;展会同期将举…

kafka里的consumer 是推还是拉?

大家好&#xff0c;我是锋哥。今天分享关于【kafka里的consumer 是推还是拉&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka里的consumer 是推还是拉&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;消费者&…

Visual Studio | 配置管理

文章目录 一、配置管理1、项目属性1.1、常规1.2、VC 目录1.3、C/C -> 常规1.4、C/C -> 预处理器1.5、C/C -> 预编译头1.6、连接器 -> 常规1.7、连接器 -> 输入 2、编辑2.1、显示空格或tab符 一、配置管理 1、项目属性 1.1、常规 字段功能目标平台版本用于生成…

Docker打包自己项目推到Docker hub仓库(windows10)

一、启用Hyper-V和容器特性 1.应用和功能 2.点击程序和功能 3.启用或关闭Windows功能 4.开启Hyper-V 和 容器特性 记得重启生效&#xff01;&#xff01;&#xff01; 二、安装WSL2&#xff1a;写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/143057041 三…

js.轮转数组和旋转链表

这是两个相似的题型&#xff0c;一个是数组&#xff0c;另一个是链表。 链接&#xff1a;189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1:…