关于在Qlabel遮罩方面的踩坑实录

先看目标效果:

想要实现封面图标的遮罩效果,有两个思路:

一、在鼠标移动到这个item上面时,重新绘制pixmap

例如以下代码:

#include <QApplication>
#include <QWidget>
#include <QPixmap>
#include <QLabel>
#include <QPainter>
#include <QColor>class TransparentOverlayWidget : public QWidget
{
public:TransparentOverlayWidget(QWidget *parent = nullptr) : QWidget(parent){// 创建 QLabel 来显示带有半透明矩形的图像label = new QLabel(this);label->setFixedSize(500,500);label->setScaledContents(true);}void paintEvent(QPaintEvent *event) override {QWidget::paintEvent(event);pixmap = QPixmap("background.jpg");// 创建QPainter并在QPixmap上绘制QPainter painter(&pixmap);// 设置半透明度,0.0为完全透明,1.0为完全不透明painter.setOpacity(0.5);// 设置绘制颜色,带有透明度painter.setBrush(QColor(255, 0, 0, 127)); // 透明度为127,最大值是255painter.setPen(Qt::NoPen);if(m_isHover) {// 绘制一个半透明矩形painter.drawRect(50, 50, 200, 150);}// 完成绘制painter.end();label->setPixmap(pixmap);}void enterEvent(QEnterEvent *event) {QWidget::enterEvent(event);m_isHover = true;qDebug()<<"进入widget";update();}void leaveEvent(QEvent *event) {QWidget::leaveEvent(event);m_isHover = false;qDebug()<<"离开widget";update();}
private:bool m_isHover  = false;QLabel *label{};QPixmap pixmap;
};int main(int argc, char *argv[])
{QApplication app(argc, argv);TransparentOverlayWidget widget;widget.show();return app.exec();
}

值得注意的是:pixmap = QPixmap("background.jpg");这行代码的位置的考究。。。

每次绘制前重新初始化 :若是将这行代码放在构造函数里面就起不到透明的效果。原因如下:
确保在每次 paintEvent 时,QPixmap 都是初始的未被修改的图像,而不是之前被修改的版本。否则你可能会在一个已经绘制了半透明矩形的 QPixmap 上再次绘制半透明矩形,这会导致透明度的叠加不正确。

 二、新建Mask的QWidget类

Mask.h:

//
// Created by WeiWang on 24-9-18.
//#ifndef MASK_H
#define MASK_H
#include<QWidget>
#include<QPainter>class Mask : QWidget
{
public:Mask(QWidget *parent = nullptr):QWidget(parent) {setWindowFlags(Qt::FramelessWindowHint);this->setFixedSize(100,100);}void paintEvent(QPaintEvent *event) {QPainter painter(this);QColor color(0,0,0,160);// 设置绘制颜色,带有透明度painter.setBrush(color);painter.setPen(Qt::NoPen);painter.fillRect(rect(),color);}void move_(int x,int y){this->move(x,y);};void hide_(){ this->hide();};void show_(){ this->show();};void raise_(){ this->raise();};
};#endif //MASK_H

main.cpp:

 #include <QApplication>#include <QWidget>#include <QPixmap>#include <QLabel>#include <QPainter>#include <QColor>#include "Mask.h"class TransparentOverlayWidget : public QWidget{public:TransparentOverlayWidget(QWidget *parent = nullptr): QWidget(parent){this->setFixedSize(500,500);// 加载图像QPixmap pixmap("F:\\code_review\\Qt-WorkSpace\\fight\\KuGouApp\\KuGouStart\\Res\\tabIcon\\music-cover.jpg");// 创建 QLabel 来显示带有半透明矩形的图像label = new QLabel(this);label->move(100,100);label->setScaledContents(true);label->setPixmap(pixmap);label->setFixedSize(100,100);label->setAlignment(Qt::AlignCenter);m_mask = new Mask(this);m_mask->move_(100,100);m_mask->hide_();}void paintEvent(QPaintEvent *event)override {if(this->m_isHover) {m_mask->show_();//m_mask->raise_();}elsem_mask->hide_();}void enterEvent(QEnterEvent *event) {QWidget::enterEvent(event);qDebug()<<"进入widget";m_isHover = true;update();}void leaveEvent(QEvent *event) {QWidget::leaveEvent(event);qDebug()<<"离开widget";m_isHover = false;update();}private:QLabel *label{};bool m_isHover = false;Mask *m_mask{};};int main(int argc, char *argv[]){QApplication app(argc, argv);TransparentOverlayWidget widget;widget.show();return app.exec();
}

注意:此处有两个坑

①mask的初始化位置:

 一旦使用了如上图所示的初始化顺序,即先初始化mask再初始化lab,那么到了后面遮罩会被label挡住,原因如下:

在 Qt 中,子控件的绘制顺序遵循父控件的层次结构和堆叠顺序。默认情况下,父控件的子控件会按照其创建的顺序绘制。因此,如果 MaskTransparentOverlayWidget 的子控件,并且在层次结构中比 QLabel 更早创建或被覆盖,那么 QLabel 会在 Mask 之上绘制,导致 Mask 被遮住。

所以一定要让mask的初始化在label之后。

② 硬要在构造列表初始化

如果一定要在构造列表初始化的话,那么就需要使用

Mask 设置为在最顶层显示: 使用 raise() 函数将 Mask 移到顶层。

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

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

相关文章

马尔科夫蒙特卡洛_吉布斯抽样算法(Markov Chain Monte Carlo(MCMC)_Gibbs Sampling)

定义 输入:目标概率分布的密度函数 p ( x ) p(x) p(x),函数 f ( x ) f(x) f(x) 输出: p ( x ) p(x) p(x)的随机样本 x m 1 , x m 2 , ⋯ , x n x_{m1},x_{m2},\cdots,x_n xm1​,xm2​,⋯,xn​,函数样本均值 f m n f_{mn} fmn​; 参数:收敛步数 m m m,迭代步数 n n n。 (1)初…

camtasia2024绿色免费安装包win+mac下载含2024最新激活密钥

Hey, hey, hey&#xff01;亲爱的各位小伙伴&#xff0c;今天我要给大家带来的是Camtasia2024中文版本&#xff0c;这款软件简直是视频制作爱好者的福音啊&#xff01; camtasia2024绿色免费安装包winmac下载&#xff0c;点击链接即可保存。 先说说这个版本新加的功能吧&#…

小微金融企业系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;贷款信息管理&#xff0c;贷款申请管理&#xff0c;贷款种类管理&#xff0c;代办项目管理&#xff0c;项目分类管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;代办项…

如何做好网站建设,多个维度解析一下

网站建设是一个复杂的过程&#xff0c;涉及多个方面的考虑。以下是一些关键步骤和最佳实践&#xff0c;帮助你做好网站建设&#xff1a; 1. 明确目标与定位 确定网站目标&#xff1a;明确你的网站是用于品牌宣传、产品销售、信息分享还是其他目的。分析受众群体&#xff1a;了…

LeetCode_sql_day27(1225.报告系统状态的连续信息)

目录 描述&#xff1a; 1225.报告系统状态的连续信息 数据准备&#xff1a; 分析&#xff1a; 代码&#xff1a; 总结&#xff1a; 描述&#xff1a; 1225.报告系统状态的连续信息 表&#xff1a;Failed ----------------------- | Column Name | Type | ----------…

机器狗与无人机空地协调技术分析

随着科技的飞速发展&#xff0c;机器狗与无人机作为智能机器人领域的杰出代表&#xff0c;正逐步在军事侦察、灾害救援、环境监测、农业植保等多个领域展现出巨大的应用潜力。本文旨在深入探讨机器狗与无人机之间的空地协调技术&#xff0c;分析其在复杂环境中的协同作业机制、…

neo4j安装启动教程+对应的jdk配置

参考这位博主的视频教程&#xff1a;neo4j社区windows版下载 一、官网下载neo4j的安装包 &#xff08;1&#xff09;官网下载页面 &#xff08;2&#xff09;上一步 【download】之后&#xff0c;会自动下载&#xff0c;如果没有&#xff0c;点击【here】 这里可以看到一行字…

TypeScript —枚举的应用

枚举的关键字&#xff1a;enum 语法&#xff1a;enum 枚举名{选项} enum Sex{boy男,girl女 } 如何使用枚举中的属性 enum Sex{boy男,girl女 }function a2(sex:Sex){console.log(张三的性别是:${sex}) } a2(Sex.boy) 运行结果&#xff1a; 枚举的作用 1.提高代码可读性&a…

fmql之ubuntu联网

需求&#xff1a;fmql搭载linux&#xff0c;并且可以远程访问。 连路由器 板卡通过网线与路由器连接&#xff0c;ip设置成同段&#xff0c;可以ping通&#xff1a; 但是ping不通baidu&#xff08;如果路由器没有网/流量的话&#xff0c;就无法上网&#xff09; ZYNQ7020通过网…

基于vue框架的宠物托管系统设计与实现is203(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,宠物种类,商家,咨询商家,用户宠物,宠物托管,宠物状况,宠物用品,用品分类,商家公告,结束托管,账单信息,延长托管 开题报告内容 基于Vue框架的宠物托管系统设计与实现开题报告 一、引言 随着现代生活节奏的加快&#xff0c;越来越…

php医院预约挂号系统小程序 LW PPT源码调试讲解

第二章 开发技术与环境配置 2.1 Php语言简介 PHP&#xff0c;原名Hypertext Preprocessor。它是属于内嵌式语言&#xff0c;在服务器上执行嵌入HTML的脚本语言&#xff0c;有点像C语言的风格&#xff0c;运用的比较广泛。Hypertext Preprocessor混合了 Perl 、C、Java和自己创…

Python基础(七)——PyEcharts数据分析(面向对象版)

四、使用PyEcharts数据分析案例&#xff08;面向对象版&#xff09; 【前言&#xff1a;为了巩固之前的Python基础知识&#xff08;一&#xff09;到&#xff08;五&#xff09;&#xff0c;并为后续使用Python作为数据处理的好帮手&#xff0c;我们一起来用面向对象的思想来理…

计算机毕业设计 二手图书交易系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Leetcode Hot 100刷题记录 -Day17(搜索二维矩阵II)

搜索二维矩阵II 问题描述&#xff1a; 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,…

【PSINS工具箱】仅速度为观测量的SINS/GNSS组合导航,MATLAB源代码,无需下载,可直接复制

工具箱 本程序需要在安装工具箱后使用,工具箱是开源的,链接:http://www.psins.org.cn/kydm 程序简述 原文的153组合导航是SINS/GPS下的位置观测或位置+速度观测,本文所述的代码是仅三轴位置观测的,使用UKF来滤波。 最后输出速度对比、速度误差、姿态对比、姿态误差、位…

Gwork企业微办公管理系统:企业管理的多面手

Gwork企业微办公管理系统&#xff1a;企业管理的多面手 在企业信息化管理的道路上&#xff0c;你是否还在为繁琐的系统集成和复杂的业务流程头疼&#xff1f;Gwork企业微办公管理系统也许就是你正在寻找的那个得力助手。本文将带你了解Gwork的核心功能及其如何帮助企业提升工作…

【Arduino】Arduino使用USB-TTL无法下载程序问题

问题描述 自己绘制了一套基于Arduino MEGA的电路&#xff0c;没有在板子上面绘制CH340的标准下载电路&#xff0c;只保留了UART0的插针用于调试和下载程序。 使用ISP烧录完bootloader后&#xff0c;发现无法使用USB-TTL工具烧录程序 问题解决过程 在网上搜索了相关资料&…

洛谷P2240——贪心算法

贪心算法是好理解的&#xff0c;是简单的&#xff0c;但是困难的可能是结构体的应用&#xff0c;stl的使用等等&#xff0c;下面这道题就体现了这一点。 这道题主要要算单价&#xff0c;通过比较单价来排序&#xff0c;并计算。 如果单开数组&#xff0c;排完单价&#xff0c;…

ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计

起因&#xff0c; 目的: 客户需求, 就是要设计一个数据库。 过程&#xff0c; 关于工具: UI 设计&#xff0c;我最喜欢的工具其实是 Canva, 但是 Canva 没有合适的模板。我用的是 draw.io, 使用感受是&#xff0c;很垃圾。 各种快捷键不适应&#xff0c;箭头就是点不住&…

【雅特力AT32】串口入门实战:轮询、中断、SWAP(收发管脚交换)功能

本文将会把数据手册结合三个案例讲解&#xff0c;需要看源码可以直接看后面。 但是代码一定要结合中断、收发配置部分来理解&#xff0c;这两部分不建议跳过&#xff01;&#xff01;&#xff01; 串口协议层不再介绍&#xff0c;需要请移步&#xff1a; 【串口通信详解】US…