Qt|制作简单的不规则窗体

news2024/11/21 2:28:26

通常我们用到的对话框基本上都是规则的,在有些特殊情况下,也会使用到不规则窗口,那么该如何实现不规则窗体呢?

在MFC框架下很难实现,应该说是难的都想放弃,但是,Qt框架下提供了一个叫做setMask()函数,用来实现不规则窗体,为窗体设置遮罩。

在今天的功能介绍中,主要是围绕如何setMask()函数进行讲解的。首先,我们看一下实现出来的效果吧!

功能:点击鼠标左键拖动窗口进行移动,鼠标右键销毁当前窗口。

用到的事件:鼠标按下事件、鼠标拖动事件、绘图事件

具体的功能操作如下:

功能层创建

新建一个Qt Widgets Application工程,基类为:QWidget,工程名字随意就行。

事件处理

为了让不规则窗口能够通过鼠标进行随意拖动,此时需要重写鼠标事件以及绘图事件。

按下事件:mousePressEvent

void QtIrregularWidget::mousePressEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton)
	{
		m_ptDragPosition = event->globalPos() - this->frameGeometry().topLeft();
		event->accept();
	}
	if (event->button() == Qt::RightButton)
	{
		close();
	}
}

代码解析:

在鼠标按下事件中根据左键和右键不同响应分为了两个功能。

就拿简单的右键响应来说,触发了鼠标右键事件后,直接退出程序。

鼠标左键触发,此时,需要保存当前鼠标点所在的位置相对于窗体左上角的偏移值。使用成员变量m_ptDragPostion。

event->globalPos():获取的鼠标位置是鼠标偏离电脑屏幕左上角(x=0, y=0)的位置。

frameGeometry()->topLeft():获取包括了标题栏客户区的左上角的点位置

在这里,就有一个小疑点,geometry()与frameGeometry()究竟有什么区别呢?

geometry()获取的区域不包括标题栏和边框区域的,而frameGeometry()是包括标题栏和边框的,也就是窗口真正的区域

移动事件:mouseMoveEvent

void QtIrregularWidget::mouseMoveEvent(QMouseEvent *event)
{
	if (event->buttons() & Qt::LeftButton)
	{
		move(event->globalPos() - m_ptDragPosition);
	}
}

代码解析:

当鼠标左键处于按下状态,且触发了mouseMoveEvent事件后,此时才会产生窗口移动效果。

移动的位置也就是由实时获取的电脑屏幕区域,减去鼠标按下时获取的最初位置。

绘图事件:paintEvent

因为添加的是不规则图片,所以,在paintEvent中需要将图片绘制到窗口中,这个没有难度。

void QtIrregularWidget::paintEvent(QPaintEvent *event)
{
	QPainter painter(this);
	painter.drawPixmap(0, 0, QPixmap(":/QtIrregularWidget/image/kcfl_n.png"));
}

不规则处理

在文章开篇就说道,设置Qt框架中不规则窗体需要用到:QWidget::setMask()函数。

所谓的不规则就是为窗口设置遮罩,遮住所选区域以外的部分使其看起来是透明的,如果选择一个png图片,该图片的透明部分就是一个遮罩。

QWidget::setMask参数可以是一个QBitmap对象或者是QRegion对象,此时,只有QPixmap::mask()可以获取图片的遮罩信息,所以,在这里,参数传入的是一个QBitmap对象。

那么,实际的处理如下代码所示:

QString qsPicturePath = ":/QtIrregularWidget/image/kcfl_n.png";

QPixmap pix;
pix.load(qsPicturePath, 0, Qt::AvoidDither | Qt::ThresholdAlphaDither | Qt::ThresholdDither);
resize(pix.size());

setMask(QBitmap(pix.mask()));

代码解析:

使用QPixmap的方式加载需要展示不规则背景图,重点是load后面的第三个参数。

参数1:图片的路径

参数2:读取图片文件的格式,一般采取默认值0

参数3:读取图片的方式。

Qt::AvoidDither:(当打算保存为文件而转化时的默认项) – 只有在图像超过256色并且它将被转化为8位时,抖动32位图像。

Qt::ThresholdAlphaDither:(默认)- 没有抖动。因为有可能填入的图片带有透明通道,所以该属性有必要存在。

Qt::ThresholdDither:没有抖动;最靠近的颜色将被使用。

根据当前加载的背景图的大小,设置窗口的整体区域,最后设置不规则方法。

到这里,一个简单的,可拖动的不规则窗口就已经实现了。

我是糯诺诺米团,一名C++开发程序媛~

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

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

相关文章

【JAVA】守护线程是什么?

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 正文 我的其他博客 正文 在计算机编程中,守护线程(daemon thread)是一种在程序运行时在后台提供服务的线程…

【正点原子STM32连载】 第四十七章 FATFS实验 摘自【正点原子】APM32E103最小系统板使用指南

1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 第四…

【模型微调】| 各类微调模型总结 P-Tuning,Prefix,P-tuning v2,LoRA

文章目录 1 微调背景1.1 Full fine-tuning 全参数微调(FFT)1.2 parameter-Efficient-fine-tuning 部分参数微调(PEFT) 2 提示词调整训练法2.1 P-Tuning2.2 Prefix2.3 P-Tuning v2 3 结构调整训练法3.1 Adapter tuning3.2 LoRA 微调…

【2024年美国大学生数学建模竞赛】F题非法的野生动物贸易 完整数据

小云更新了全网最全的F题数据 另外也为大家分享: 技术文档,包括问题分析、建立模型、求解结果等,配套有思路分析视频、代码讲解视频。美赛官方限制总页数为25页,我们的思路长度为35页以上。所有模型都有求解代码和指标&#xff0…

数字化转型:企业适应新常态的关键之举_光点科技

在全球商业环境不断演变和技术日新月异的背景下,数字化转型已经成为企业不可回避的课题。它不仅关乎企业的未来生存与发展,更是适应新常态、提升竞争力的关键之举。但是,数字化转型并非一夜之间可以完成的任务,它需要全面的策略规…

九、显卡性能参数、接口

1、显卡说明 显卡的好坏直接影响画面的流畅度,一般大型游戏都会有一些电脑的推荐配置,里面就会说到显卡。 显卡,也称为显示卡(Video Card),是个人计算机基础的组成部分之一,负责将计算机系统需要…

前缀和 差分

差分和前缀和都是算法里边比较重要的知识点,不过学习的难度并不高,这篇文章会讲解相关的内容。 1. 前缀和怎么玩 1)一维前缀和 在该数之前,包括该数的所有数之和,有点类似高中学的数列的前n项和Sn。 2)二维…

2024年美赛A题:资源可用性和性别比例 Resource Availability and Sex Ratios 思路模型代码解析

2024年美赛A题:资源可用性和性别比例 Resource Availability and Sex Ratios 思路模型代码解析 【点击最下方群名片,加入群聊,获取更多思路与代码哦~】 问题翻译 虽然一些动物物种存在于通常的雄性或雌性之外,但大多数物种在很大…

ncc匹配(二,补足旋转)

先看运行结果: 第一张图是基于形状匹配结果0.992,第二张是匹配结果的ncc结果,1 再看旋转后: 看到没,旋转后,基于形状匹配结果28度,0.517,根据匹配结果ncc结果是0.99 我们看到ncc以…

聊一聊Tomcat的架构和运行流程,尽量通俗易懂一点

1、Tomcat的架构 这里可以看出 A、一个Tomcat就是一个Server,一个Server下会有多个Service, B、Service只负责封装多个Connector和一个Container(Service本身不是容器,可以看做只是用来包装Connector和Container的壳&#xff0c…

户外没有电源和网络,但需要安装监控系统,怎么办?太阳能智能监控系统给你解决

近期有粉丝给小编求助:需要在没网没电的户外进行智能监控的安装,不知道如何解决。收到粉丝的问题,小编立刻联系了技术人员给出方案。针对野外、户外等场景只需使用太阳能供电模组4G摄像机视频监控EasyCVR平台智能分析网关V4的架构&#xff0c…

Leetcode—2950. 可整除子串的数量【中等】Plus(前缀和题型)

2024每日刷题(一零八) Leetcode—2950. 可整除子串的数量 算法思想 让 f ( c ) d , 其中 d 1 , 2 , . . . , 9 f(c) d, 其中d 1, 2, ..., 9 f(c)d,其中d1,2,...,9. // f(c1) f(c2) ... f(ck) / k avg // > f(c1) f(c2) ... f(ck) - …

spring中生成jwtToken字符串以及解析手写通用工具类

当前使用JWT&#xff0c;肯定得提前准备jwt相关的导入依赖。 <!-- 关于jwt 生成令牌--> <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>${jjwt.version}</version> </dependency…

【前沿技术杂谈:开源软件】引领技术创新与商业模式的革命

【前沿技术杂谈&#xff1a;开源软件】引领技术创新与商业模式的革命 开源软件如何推动技术创新开源软件的开放性和协作精神促进知识共享和技术迭代推动关键技术的发展开源软件与新技术的融合 开源软件的商业模式开源软件的商业模式将开源软件与商业软件相结合 开源软件的安全风…

Acwing---798.差分矩阵

差分矩阵 1.题目2.基本思想3.代码实现 1.题目 输入一个 n n n 行 m m m列的整数矩阵&#xff0c;再输入 q q q 个操作&#xff0c;每个操作包含五个整数 x 1 , y 1 , x 2 , y 2 , c x1,y1,x2,y2,c x1,y1,x2,y2,c&#xff0c;其中 ( x 1 , y 1 ) (x1,y1) (x1,y1) 和 ( x …

C++——日期类

前言&#xff1a;哈喽小伙伴们&#xff0c;在上一篇文章中我们对C类与对象的前半段知识进行了简单的分享&#xff0c;其中比较重要的莫过于C类的六个默认成员函数。 所以这篇文章&#xff0c;我们通过实现一个完整的日期的操作&#xff0c;来对这些成员函数有一个更加深入的理…

nginx反向代理----->微服务网关----->具体微服务

今天&#xff0c;做项目的时候做项目的时候配路由出现bug&#xff0c;特此理顺一下从nginx到微服务网关再到微服务这一过程。 nginx配置 upstream admin-gateway{server localhost:21217; }server {listen 8803;location / {root F:/develop/admin-web/;index index.html;}…

strlen函数详解

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

MATLAB实现二阶模糊逻辑控制系统仿真

1. 内容 假设某一工业过程可等效成以下二阶系统&#xff1a; 设计一个模糊控制器&#xff0c;使其能自动建立模糊规则库&#xff0c;保证控制规则如表1所示&#xff0c;这种规则可表示为&#xff1a; 式中&#xff0c;fix为取整函数&#xff1b;E为误差的模糊集&#xff1b;DE…

惯性导航---常用坐标系

惯性导航—常用坐标系 捷联惯导系统的导航解算中&#xff0c;常用到四个坐标系&#xff0c;接下来介绍四个坐标系定义及其表示符号。 1 地心惯性坐标系&#xff08;i系&#xff09; 惯性传感器的输出是以该坐标系为参考基准的。 原点X轴Z轴Y轴地球中心赤道平面内&#xff0c…