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

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

在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.hqwc.cn/news/447935.html

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

相关文章

Python+PyQt5+C Hw信息检测

UI主界面: C源代码: /* I/O port access* Copyright (C) 2009 Red Hat Inc.** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Fo…

kingbase控制文件重建

背景: 测试版本:V008R006C005B0023 sys_control文件在数据目录的global下 若sys_control文件损坏或被删,会导致库无法启动 处理方式: 所在目录为数据目录 1、尝试dryrun touch global/sys_control sys_resetwal -l 00000001…

用Audio2Face导出Unity面部动画

开始之前说句话,新年前最后一篇文章了 一定别轻易保存任何内容,尤其是程序员不要轻易Ctrl S 在A2F去往Unity的路上,还要经历特殊Blender,自己电脑中已下载好的可能不是很好使。 如果想查看UE相关的可以跳转到下边这两篇链接 1. …

2024年第九届信号与图像处理国际会议(ICSIP 2024)

2024第九届信号与图像处理国际会议(ICSIP 2024)将于2024年7月12-14日在中国南京召开。ICSIP每年召开一次,在过去的七年中吸引了1200多名与会者,是展示信号和图像处理领域最新进展的领先国际会议之一。本次将汇集来自亚太国家、北美…

#10外部网页跳转vue3+SpringMVC解码GBK编码的参数

目录 1、背景 2、失败尝试之iconv-lite 2.1、安装和使用 2.2、遇到的问题 2.3、解决方案(vite-plugin-node-polyfills) 2.4、测试 3、成功尝试 3.1、前端参数读取方式 3.2、后端解码 1、背景 外部jsp页面中编码方式为GBK,跳转到vue页面时如果使用decodeURI…

C#,入门教程(33)——万能的数据接送者json

上一篇: C#,入门教程(32)——程序运行时的调试技巧与逻辑错误探针技术与源代码https://blog.csdn.net/beijinghorn/article/details/126014885 作为21世纪的编程者,无论你是前端还是后端,都逃不过“json”。 一、什么是 json&…

中耳分析时,鼓室图有哪几种分型?

做中耳分析时,鼓室图有哪几种分型? 目前,临床上最常用的鼓室图分型法是由Jerger提出的,主要分为A型、As型、Ad型、B型和C型五种类型。 A型 正常成人的鼓室图峰补偿静态声导纳值为0.3~1.6 mmho(Silman等报…

【Linux】环境基础开发工具的使用之gcc详解(二)

前言:上一篇文章中我们讲解了Linux下的vim和yum的工具的使用,今天我们将在上一次的基础上进一步的讲解开放工具的时候。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:Linux的深度刨析 👈 &#x1f4a…

Jmeter学习系列之五:基础线程组(Thread Group)

前言 线程组是一系列线程的集合,每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中,每个线程意味着模拟一个真实用户向服务器发起请求。 在 jmeter 中,线程组组件运行用户设置线程数量、初始化方式等等配置。 例如,如果你设置线程数为 100,那么 jmeter 将创建…

【python接口自动化】- PyMySQL数据连接

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

1E,Jarvis March

四个问题: 一,Jarvis March算法借鉴了什么算法? 二,如何确定初始点 三,如何获取凸包的边? 四,Jarvis March算法的好处在哪里? 首先看第一个问题, 一,Jarvis …

vue2 el-form 两个时间框(第一个时间框是只能选择当前时间,之前的是不允许选择,第二个时间框是第一个时间的当前的时间后30天后可以选择的)

<template><div id"app"><el-form :model"form"><el-form-item label"预签时间"><el-date-picker v-model"form.t2" type"date" placeholder"选择预签时间" changepreSigning/><…