当前位置: 首页 > news >正文

Qt实现圆形窗口

重新实现paintEvent()函数。

效果如下:

 效果为蓝色区域,背景是vs接面,代码直接复制可用,留给有需要的人。

#ifndef CircleWidget_h__
#define CircleWidget_h__#include <QWidget>class CCircleWidget : public QWidget
{Q_OBJECTpublic:explicit CCircleWidget(QWidget* parent = 0); // explicit 避免歧义CCircleWidget(const QString& strImagePath, int nRadius, QWidget* parent = 0);public:void SetNormalOutLineColor(QColor color);void SetHoverOutLineColor(QColor color);void SetPressedOutLineColor(QColor color);void SetOutLineWidth(int nWidth);void SetImagePath(const QString& strImagePath);void SetHovered(bool bHovered);void SetPressed(bool bPressed);protected: // overridevoid Init();void paintEvent(QPaintEvent*) override;                // 绘图事件,调用update()时触发void mousePressEvent(QMouseEvent* e) override;          // 鼠标按下事件void mouseReleaseEvent(QMouseEvent* e) override;        // 鼠标释放事件void enterEvent(QEvent*) override;                     // 鼠标进入事件void leaveEvent(QEvent*) override;                     // 鼠标离开事件signals:void SigClicked(); // 点击信号private:QString m_strImagePath; // 图片路径QColor m_normalColor;QColor m_hoverColor;QColor m_pressedColor;int m_nWidth;int m_nRadius;        // 圆形半径bool m_bPressed;      // 左键单击控制bool m_bHovered;      // 鼠标悬停控制
};#endif // CircleWidget_h__
#include "CircleWidget.h"
#include <QPainter>
#include <QMouseEvent>CCircleWidget::CCircleWidget(QWidget* parent): QWidget(parent), m_strImagePath(":/dotnetIcon.png"), m_normalColor("#58a3ef"), m_hoverColor("#6eb8f5"), m_pressedColor("#417cac"), m_nWidth(4), m_nRadius(46), m_bPressed(false), m_bHovered(false)
{Init();
}CCircleWidget::CCircleWidget(const QString& strImagePath, int nRadius, QWidget* parent): QWidget(parent), m_strImagePath(strImagePath), m_normalColor("#58a3ef"), m_hoverColor("#6eb8f5"), m_pressedColor("#417cac"), m_nWidth(4), m_nRadius(nRadius), m_bPressed(false), m_bHovered(false)
{Init();
}void CCircleWidget::SetNormalOutLineColor(QColor color)
{m_normalColor = color;
}void CCircleWidget::SetHoverOutLineColor(QColor color)
{m_hoverColor = color;
}void CCircleWidget::SetPressedOutLineColor(QColor color)
{m_pressedColor = color;
}void CCircleWidget::SetOutLineWidth(int nWidth)
{m_nWidth = nWidth;
}void CCircleWidget::SetImagePath(const QString& strImagePath)
{m_strImagePath = strImagePath;
}void CCircleWidget::SetHovered(bool bHovered)
{m_bHovered = bHovered;update();
}void CCircleWidget::SetPressed(bool bPressed)
{m_bPressed = bPressed;update();
}void CCircleWidget::Init()
{// 无边框setWindowFlags(Qt::FramelessWindowHint);// 窗口背景透明setAttribute(Qt::WA_TranslucentBackground, true);
}void CCircleWidget::paintEvent(QPaintEvent*)
{QPainter p(this);p.setRenderHint(QPainter::Antialiasing);QPen pen;pen.setWidth(m_nWidth);if (m_bPressed){pen.setColor("#417cac"); // 按下时的边框颜色}else if (m_bHovered){pen.setColor("#6eb8f5"); // 悬停时的边框颜色}else{pen.setColor("#58a3ef"); // 正常状态的边框颜色}p.setPen(pen);p.setBrush(Qt::NoBrush);// 设置圆心为圆的半径,以确保圆形完整显示//QPoint center(m_nRadius + m_nWidth / 2, m_nRadius + m_nWidth / 2);QPoint center(rect().center());// 绘制背景圆形p.drawEllipse(center, m_nRadius, m_nRadius);// 绘制图片QPixmap pixmap(m_strImagePath);QRect imageRect(0, 0, 2 * m_nRadius, 2 * m_nRadius); // 计算图片绘制区域QPainterPath clipPath;clipPath.addEllipse(center, m_nRadius, m_nRadius);p.setClipPath(clipPath);p.drawPixmap(center.x() - m_nRadius, center.y() - m_nRadius, imageRect.width(), imageRect.height(), pixmap);
}void CCircleWidget::mousePressEvent(QMouseEvent* e)
{m_bPressed = true;update();
}void CCircleWidget::mouseReleaseEvent(QMouseEvent* e)
{m_bPressed = false;update();
}void CCircleWidget::enterEvent(QEvent*)
{m_bHovered = true;update();
}void CCircleWidget::leaveEvent(QEvent*)
{m_bHovered = false;update();
}

相关文章:

Qt实现圆形窗口

重新实现paintEvent()函数。 效果如下&#xff1a; 效果为蓝色区域&#xff0c;背景是vs接面&#xff0c;代码直接复制可用&#xff0c;留给有需要的人。 #ifndef CircleWidget_h__ #define CircleWidget_h__#include <QWidget>class CCircleWidget : public QWidget {Q…...

LeetCode 算法:有效的括号 c++

原题链接&#x1f517;&#xff1a;有效的括号 难度&#xff1a;简单⭐️ 题目 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; …...

react和vue的diff算法的差别

React 的 Diff 算法 React 的 diff 算法主要基于以下几个原则&#xff1a; 同层比较&#xff1a; React 只会比较同一层级的节点&#xff0c;不会跨层级比较。假设跨层级的变化较少&#xff0c;从而简化了算法&#xff0c;提高了性能。 深度优先遍历&#xff1a; React 采用深…...

算法【滑动窗口】

滑动窗口指的是维持左、右边界都不回退的一段范围&#xff0c;来求解很多子数组&#xff08;串&#xff09;的相关问题。 滑动窗口的关键是找到范围和答案指标之间的单调性关系&#xff08;类似贪心&#xff09;。 滑动过程&#xff1a;滑动窗口可以用简单变量或者结构来维护…...

【RISC-V设计-06】- RISC-V处理器设计K0A之ALU

【RISC-V设计-06】- RISC-V处理器设计K0A之ALU 文章目录 【RISC-V设计-06】- RISC-V处理器设计K0A之ALU1.简介2.顶层设计3.内部结构4.端口说明5.操作码说明6.设计代码7.总结 1.简介 算术逻辑单元&#xff08;Arithmetic Logic Unit&#xff0c;简称 ALU&#xff09;是计算机中…...

MyIP:强大且简单好用!

在这个数字化的时代&#xff0c;IP地址就像是我们的网络身份证。各位在日常的工作中&#xff0c;肯定会会遇到需要和 IP 地址相关的需求。 今天和大家聊一聊一个非常好用的开源 IP 工具项目 - MyIP。 简介 MyIP一个开源IP工具箱&#xff0c;提供了一系列的网络检测工具&…...

Redis作为缓存,如何与MySql的数据进行同步?

允许延时一致的业务 概念 采用异步通知使用MQ作为中间件&#xff0c;更新数据之后通知缓存删除利用canal中间件&#xff0c;不需要修改业务代码&#xff0c;伪装成Mysql的一个从节点&#xff0c;canal通过读取binlog数据更新缓存 强一致性业务 概念 采用Redission提供的读写锁…...

Android 通知栏推送功能

Android 通知栏推送功能 Android 通知栏推送功能 让消息在用户的通知栏上显示&#xff0c;并且点击后跳转到指定的页面 MainActivity.Java import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import andro…...

【LVS】防火墙mark标记解决调度问题

实验环境是在之前部署DR模式集群的基础上做的&#xff0c;参考如下 部署DR模式集群 以http和https为例&#xff0c;当我们在webserver中同时开放80和443端口&#xff0c;那么默认控制是分开轮询的&#xff0c;就会出现了一个轮询错乱的问题&#xff1a; 当第一次访问80被轮询…...

算法笔记|Day20回溯算法II

算法笔记|Day20回溯算法II ☆☆☆☆☆leetcode 39. 组合总和题目分析代码 ☆☆☆☆☆leetcode 40.组合总和II题目分析代码 ☆☆☆☆☆leetcode 131.分割回文串题目分析代码 ☆☆☆☆☆leetcode 39. 组合总和 题目链接&#xff1a;leetcode 39. 组合总和 题目分析 本题采用回…...

Oracle认证1Z0-071线上考试注意事项

目录 一、前言二、回顾过往战绩第一次 裸考&#x1f412;第二次 背题库硬考&#xff01;&#x1f412;第三次 软件卡住&#xff0c;寄&#xff01;&#x1f648;第四次 汇总纠错&#xff0c;通过&#xff01;&#x1f31a; 三、考试流程四、考试注意事项1. 是否需要科学上网2. …...

【C++ 面试 - 基础题】每日 3 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…...

影响LabVIEW工作效率的因素有哪些

影响LabVIEW工作效率的因素可以分为多个方面&#xff0c;涵盖硬件、软件、开发环境和编程习惯等。以下是一些常见的影响因素&#xff1a; 1. 硬件因素 处理器性能&#xff1a;处理器的速度和核心数量对LabVIEW程序的执行效率有很大影响。 内存大小&#xff1a;足够的内存可以保…...

linux 裸机.之SPV5210,dnw,usb,sdk,fastboot刷机(一)

linux 裸机.之SPV5210&#xff0c;dnw&#xff0c;usb&#xff0c;sdk&#xff0c;fastboot刷机&#xff08;一&#xff09;...

性能测试工具LoadRunner

前言&#x1f440;~ 上一章我们介绍了性能测试的一些基本概念&#xff0c;重要的是性能测试的各项指标&#xff0c;今天我们使用性能测试工具LoadRunner简单的完成一次性能测试 性能测试Load Runner LoadRunner是什么&#xff1f; LoadRunner安装 LoadRunner脚本录制 1.录…...

智能归来:深入探索人工智能回归模型的奥秘

人工智能之回归模型 1. 回归模型的数学基础1.1 回归分析的基本原理1.1.1 目标变量与预测变量的关系1.1.2 线性回归模型 1.2 矩阵形式的回归模型1.2.1 回归方程的矩阵表示1.2.2 矩阵运算的基本性质及其在回归分析中的应用 1.3 总结 2. 最小二乘法 (Ordinary Least Squares, OLS)…...

swift 中,对象() 和 对象.init() 的共同点和异同点

在阅读同事的代码时&#xff0c;不同人对对象的初始化方式是不一样的&#xff0c;例如存在一个对象AController, 有些人创建的方式如下&#xff1a; let controller AController()也有人创建的方式如下&#xff1a; let controller AController.init()下面来说明一下&#…...

Google安装JSON-handle扩展

JSON-hande下载地址&#xff1a; JSON-Handle 官网 - 打开json格式文件的浏览编辑器 1. 重命名扩展文件(crx)后缀 为 zip。 2. 解压zip成文件夹&#xff0c;保存到指定目录。 3. Google浏览器地址栏输入 “chrome://extensions/”回车。然后开启 开发者模式。 4. 点击“加载…...

剖析算法内部结构----------贪心算法

什么是贪心算法&#xff1f; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在问题求解过程中&#xff0c;每一步都采取当前状态下最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致最终的全局最优解的算法策略。 贪心算法的核心思想是做选择时&…...

uni-app开发微信小程序注意事项,不要用element-ui

前端扩展组件千万不要用element-ui&#xff0c;开发的时候不报错&#xff0c;发布的时候会报错无法发布。 可以用vant weapp【注意是weapp】 iView weapp 附上hbuilder官方文档 组件的概念 | uni-app官网 (dcloud.net.cn)...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...