Qt实现圆形窗口

news2024/9/23 17:18:40

重新实现paintEvent()函数。

效果如下:

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

#ifndef CircleWidget_h__
#define CircleWidget_h__

#include <QWidget>

class CCircleWidget : public QWidget
{
	Q_OBJECT

public:

	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: // override

	void 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();
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL安装以及配置

目录 1. MySQL安装包下载 2. 安装 3. 配置 4. 使用MySQL 5. 配置环境变量 1. MySQL安装包下载 1.1 迅雷下载 分享文件&#xff1a;MySQL安装包.zip 链接&#xff1a;https://pan.xunlei.com/s/VO3llUOt6rFFWl9TdrTrJI-cA1?pwdxere# 1.2 官网下载 MySQL :: Download MyS…

如何从戴尔笔记本电脑硬盘恢复数据

“如何从坏掉的戴尔笔记本电脑硬盘中恢复数据&#xff1f;我无法访问硬盘&#xff0c;但我确实需要从硬盘中检索数据。我有很多重要文件被困在那里。” 人们学习如何从戴尔笔记本电脑硬盘恢复数据的原因有很多&#xff0c;例如有意或无意删除、硬盘格式化、安全警告隔离受病毒…

springboot社区旧物回收系统-计算机毕业设计源码94813

目 录 摘要 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 社区旧物回收系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 社…

适合出行的蓝牙耳机推荐有吗?盘点4款开放式耳机排行版前十名

如果说出行想要佩戴耳机&#xff0c;但是又不知道选什么样的耳机&#xff0c;那其实你可以看看我的建议。因为我自己其实是个比较爱玩爱出去乱逛且选择恐惧症的耳机重度患者&#xff0c;所以就平时经常会跑去公园散步戴耳机听歌&#xff0c;或者是自己去野炊之类的&#xff1b;…

二叉树的遍历与根据遍历序列求二叉树

二叉树的遍历&#xff1a; 1、先序遍历&#xff1a;DLR 2、中序遍历: LDR 3、后序遍历: LRD (L表示遍历左子树&#xff0c;D表示遍历根结点&#xff0c;R表示遍历右子树&#xff09; 以下图举例说明&#xff1a; 以先序遍历为例&#xff1a; 1、因为先序遍历的规则为D…

直击Vue2/3watch的底层逻辑,字符串长度对侦听效率的影响

目录 直击Vue2/3watch的底层逻辑&#xff0c;字符串长度对侦听效率的影响 一、Vue 2的底层原理 二、Vue 3的底层原理 三、基础类型性能消耗 四、数据变化比较原理 1、Vue 2 中的引用类型比较 2、Vue 3 中的引用类型比较 3、字符串比较&#xff08;基础类型比较&#xf…

数据结构(学习)2024.8.6(顺序表)

今天开始学习数据结构的相关知识&#xff0c;大概分为了解数据结构、算法&#xff1b;学习线性表&#xff1a;顺序表、链表、栈、队列的相关知识和树&#xff1a;二叉树、遍历、创建&#xff0c;查询方法、排序方式等。 目录 一、数据结构 数据 逻辑结构 1.线性结构 2.树…

土压力计的基本工作原理:振弦式土压力计的奥秘

在土木工程、地质勘探及地下结构工程中&#xff0c;土压力计作为一种重要的监测设备&#xff0c;扮演着至关重要的角色。它能够实时、准确地测量土体内部的压力变化&#xff0c;为工程的安全性和稳定性提供可靠的数据支持。其中&#xff0c;振弦式土压力计以其高精度、稳定性好…

20-导线及NetLabel的添加

1.放置电气导线&#xff1a;ctrlw 2.放置网络标签

FCBFormer复现

表1 Kvasir-SEG复现结果&#xff1a;mDice&#xff1a;0.93846&#xff0c;mIoU&#xff1a;0.890299&#xff0c;mPrec.&#xff1a;0.945872&#xff0c;mRec.&#xff1a;0.940086 CVC-ClinicDB复现结果&#xff1a;mDice&#xff1a;0.946874&#xff0c;mIoU&#xff1a;0…

【Math.NET】使用Fit.Polynomial多项式拟合(直线、抛物线)的示例代码与示意图

介绍 Math.NET是一个开源项目&#xff1a;https://www.mathdotnet.com/&#xff0c;旨在构建和维护涵盖基础数学的工具箱&#xff0c;以满足 .NET开发人员的高级需求和日常需求。 关于Math.NET用法的参考博客&#xff1a; https://www.cnblogs.com/dino623/p/curve_fitting_a…

Canvas-Editor 基于canvas/svg的富文本编辑器

前言 哎&#xff0c;最近逛论坛&#xff0c;看的文章&#xff0c;真是水的一批&#xff0c;且不说水平咋样&#xff0c;有些结论、方法都是错的&#xff0c;不符合前端模块化、工程化规范&#xff0c;自己写写demo&#xff0c;觉得成功了&#xff0c;恨不得马上分享写博客&…

我的JavaScript异常监控策略:保护前端应用免受错误的困扰!

在上一篇文章如何及时发现网页的隐形错误中我们讲了&#xff0c;前端有哪些常见的异常&#xff0c;以及如今监控获取这些异常的方法&#xff0c;今天我们就来讲讲我是如何来监控我的JavaScript异常的。 背景 浏览器侧的异常分为两种类型 JavaScript 错误&#xff0c;一般来自…

为什么在网页编辑文字时键盘输入换行要停顿一下 网页才显示

事情的起因&#xff1a; 不知道从什么时候开始&#xff0c;在浏览器上编辑文字时&#xff0c;换行操作总是延迟响应&#xff0c;但点击空格网页响应速度正常。时间长了也习惯了&#xff0c;可能觉得本来就是这样吧&#xff0c;网页编辑可能不稳定&#xff0c;加上自己使用的是蓝…

结构体structure、共用体union

结构体 结构体类型——用来描述复杂数据的一种数据类型 构造类型&#xff08;用户自定义类型&#xff09; struct 结构体类型名 { 成员列表; }; struct关键字&#xff1a;表明是在构造一个结构体的类型 结构体名&#xff1a;用来描述结构体这个类型的一个名称 成员列表&…

JavaWeb系列十一: Web 开发会话技术Session

Web 开发会话技术Session Session有什么用session基本原理session原理示意图session可以做什么如何理解Session Session常用方法Session底层实现机制原理分析图应用实例session实现原理动画 Session生命周期Session生命周期说明Session生命周期实例 作业布置 Session有什么用 …

8.9 C++

1.思维导图 2. 搭建一个货币的场景&#xff0c;创建一个名为 RMB 的类&#xff0c;该类具有整型私有成员变量 yuan&#xff08;元&#xff09;、jiao&#xff08;角&#xff09;和 fen&#xff08;分&#xff09;&#xff0c;并且具有以下功能&#xff1a; (1)重载算术运算符…

书生大模型实战营第三期_L2-LMDeploy 量化部署进阶实践(81班1101作业)

大模型的痛点 大模型的计算量是非常大的 2. 显存的相应区域是非常大的 3.访存瓶颈 GPU的大部分时间都花在数据交换上面不断拉高batchsize&#xff0c;不断地提高计算的访存比是不是会有较好的效果呢&#xff1f;这是一个很好的想法&#xff0c;但是显存不够就会很尴尬为了能…

【youcans动手学模型】YOLO5 实战(中)训练目标检测模型

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans YOLO5 实战 &#xff08;上&#xff09;环境配置与测试 【youcans动手学模型】YOLO5 实战&#xff08;中&#xff09;使用自己的数据集训练目标检测模型 1. 准备训练数据集1.1 开源数据集1.2 YOLOv5 …

k8s1.18.0完整部署教程

k8s的官网地址&#xff1a;https://kubernetes.io/docs Kubernetes 也称为 K8s&#xff0c;是一个开源系统&#xff0c;用于自动化容器化应用程序的部署、扩展和管理。 K8s通过各种资源对象来管理pod相关的功能&#xff0c;借助pod本身的功能实现大规模容器应用的自动化管理&…