教你如何用Qt做透明的窗体,setMask,Qt,Opacity

QWidget中setMask函数 1.场景说明 在项目中,我们有时候会遇到一些特殊的UI场景。比如如下图所示: 这种带阴影的模糊效果,其实这种效果的方法很多。但是我想的是,尽量不要让我自己手动写代码实现效果。用UI设计器能搞定就行了。尽量少手写代码 像这种的带浮层的阴影效果,最上面就是一层阴影的窗口。 这样就会有一个问题,就是上面的是阴影窗口。如果下面有按钮或者其他的窗口,你点击的时候就不会有事件过来。因为事件被上一层窗口截获了。 有的朋友就可能会想到用setAttribute(Qt::WA_Transparen... 阅读详情
// In this function, we can get the height and width of the current widget
void Widget::resizeEvent(QResizeEvent *)
{
    // Use a bitmap as a mask. A bitmap only has two kind of colors: white(value is 0)
    // or black(other values). When we use it to set mask, we can see the window at the position
    // where the color value is 0, and other place will be transparent.
    QBitmap bitMap(width(),height()); // A bit map has the same size with current widget
    QPainter painter(&bitMap);
    painter.setPen(QColor(255,255,255)); // Any color that is not QRgb(0,0,0) is right
    painter.drawRect(0,0,width(),height());

    // Now begin to draw the place where we want to show it
    painter.setPen(QColor(0,0,0));
    drawTextOnWin(&painter);
    drawImageOnWin(&painter);

    setMask(bitMap);
}
void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(QColor(Qt::red));
    // As the place where we want to draw has been set opaque in the resizeEvent, so what we draw here
    // will be shown
    drawTextOnWin(&painter);
    drawImageOnWin(&painter);
}
void Widget::drawTextOnWin(QPainter *painter)
{
    painter->setFont(QFont(font().family(),15));
    painter->drawText( (width()-300)/2,0,300,50,Qt::AlignHCenter,"Now you can see me!");
}
void Widget::drawImageOnWin(QPainter *painter)
{
    QPixmap imageTest(":/imageItem/pngImage.png");
    painter->drawPixmap( (width()-imageTest.width())/2, (height()-imageTest.height())/2,
                          imageTest.width(), imageTest.height(), imageTest );
}

上面是源码。附件里是效果图。
Qt提供了setOpacity的函数,但是使用之后,窗体所有子控件都变成同样的透明色了。
这里我们利用setMask()函数,以QBitmap为参数,通过对QBitmap做精细的操作(关键在于QBitmap支持用painter直接在上面绘制),最终达到这样的效果:我们想要透明的地方变成透明,我们想要放置部件的地方变成非透明可见的。这样就达到了我们想要的效果。
具体实现的方法也很简单:如果你想在paintEvent里面绘制任何内容,也要同时在QBitmap上做绘制,前提是在QBitmap上绘制的时候画笔的rgb设置成QRgb(0,0,0)。
道理我已经讲明白了。大家可以自己把代码弄到自己的类里面实验一下。
例子中只是最简单的演示,按照这个思路我想可以做出更多更灵活的应用的,比如可以让窗体介于透明和非透明之间(这里需要准备一个对应的透明色的png图片,或者使用相应的Qt函数来做都行)。最关键的是这种方法下透明度的操作不会影响到子控件的。
这里的
图片:An_Example_How_To_Draw_A_Transparent_Widget.png 
转载:教你如何用Qt做透明的窗体,setMask,Qt,Opacity - 楚江北 - 矮子爬梯
Qt之遮罩—实现不规则窗体 使用遮罩可以将窗口形状多样化,变成各种各样的图片或者图形,相信看完这篇文章可以让你实现多样化窗口和部件时更加游刃有余! 阅读详情

相关推荐

Qt QStackedWidget平滑切换动画实现:淡入淡出与滑动效果详解

在桌面应用开发中,界面切换的流畅性是提升用户体验的关键因素。通过动画技术实现平滑过渡,能够有效降低用户在不同任务间切换时的认知负荷,增强应用的视觉连贯性和专业度。其核心原理是利用属性插值动画,在页面切换过程中动态改变控件的位置、透明度等视觉属性,从而创造出自然的过渡效果。在Qt框架中,QPropertyAnimation类为实现这类动画提供了强大支持,它可以对任何Q_PROPERTY进行插值计算。结合QStackedWidget进行页面管理,开发者能够为多页面应用添加丰富的切换效果,如淡入淡出、水平滑动等。

深未来技术 483

Qt使用Mask实现异形按钮.rar

5.保证无毒 1.简单,方便,实用 3.实例可以自行改用 1.如有非法,本人无法律责任! 8.更多作品,查找标签“朱建强”7.下载,请杀毒! 4.如需联系我请看左边数字!1.如不知代表何物,那就放弃计算机吧! 0.还不懂?CSDN老板不让我上传联系方式。

使用QT 开发不规则窗体

QT中使用不规则窗体,有面。

x879014419的博客 1404

QT使用图片为窗口设置遮罩,创建不规则形状的窗口

准备一张透明背景色的图片,将图片添加到qt的资源文件中 2.使用QPixmap加载图片,设置窗口的大小为图片的大小,并为窗口设置遮罩 QPixmap pix; //加载图片 pix.load(":/image/yafeilinux.png"); //设置窗口大小为图片大小 resize(pix.size()); //为窗口设置遮罩 setMask(pix.mask()); 重写绘图事件将图片绘制在窗口上 void Widget::pai.

kllo__的博客 1141

Qt setMask 窗口

根据文档: 1:void QWidget::setMask(const QBitmap & bitmap); 2:void QWidget::setMask(const QRegion & region); 所以可以用透明图片和自定义区域设置 如: 1:透明图片设置,如果需要显示图片,还需将图绘制添加 paint; void paintEvent(QPaintEvent *

chinabinlang的专栏 1万+

qtsetMask()的图片设置

首先设置一张主图,就是你要显示的图片,然后准备一张遮掩图,用QBitmap类型,遮掩图中1.黑色区域表示显示的部分,2.白色区域表示不显示部分

qq_35674193的博客 7756

透明窗体窗体显示

// In this function, we can get the height and width of the current widgetvoid Widget::resizeEvent(QResizeEvent *){// Use a bitmap as a mask

LQ0622的资料库 1016

Qt基础技术(经验积累)

Qt基础技术,学习笔记。列举了常用到的技术点,以及解决方案。去掉字符串前后的空格函数,模式对话框,QList 输出结果,Qt信号与槽,QTimer类,去掉标题栏和设置窗口透明用法等等。

凌云(lankin)的专栏 5719

qt 多边形填充 生成语义分割的mask 灰度图

直接在QWidget界面显示,重写paintEvent即可 如上图所示: 没有path.moveTo(10, 10); 会从左上点开始画 没有path.closeSubpath(); 最后封闭多边形的那条线就没有了。场景: 输入:多边形的点集(有多个多边形) 输出:一个矩阵,存成灰度图 要求: 多边形1,圈出来的地方都填充数字1;多边形2圈出来的地方填充数字2.。。。。。背景全是0分析:步骤: 在彩图上绘制并填充多边形 这里我假设 ,从彩图转灰度图是只用到 rgb中的g,所以颜色只有g有值 然后把彩图转

fuyouzhiyi的博客 1082

不规则窗体setMask()

Qt建立的窗体大多数是方形的,有时需要圆形、椭圆形等不规则的对话框。 setMask()函数为窗体设置遮罩,实现不规则窗体。设置遮罩后的窗体尺寸依然是原窗体的大小,只是被遮罩的地方不可见。 实例+代码及详细注释.

菜鸟打怪的博客 2334

Qt图形特效:QGraphicsOpacityEffect

一、描述 不透明度效果使源具有不透明度。该效果对于使源半透明非常有用,类似于淡入/淡出序列。可以使用setOpacity()函数修改不透明度。 二、属性成员 1、opacity : qreal。此属性保存不透明度。该值应在0.0到1.0的范围内,其中0.0是完全透明的,而1.0是完全不透明的。默认情况下,不透明度为0.7。 2、opacityMask : QBrush。此属性保留不透明蒙版。不透明度蒙版允许您将不透明度应用于元素的各个部分。默认情况下没有不透明蒙版。 三、成员函数 1、void

友善啊,朋友的博客 4100

Qt 之 QLabel 设置面罩

效果图QLabel 是Qt 中的标签类,一般情况我们只是设置文字描述,但是QLabel不仅仅只是显示一些文字介绍那么简单。QLabel支持Html中标签的使用,同时可以设置普通图片和动态图。这里简单介绍一下如何为QLable设置面罩。代码很简单,通过设置不同形状的面罩可以达到不同的效果。1、设置动态图片QPixmap pixmapMask(":/Resources/maskRound.png");

前行之路还需前行 6166

Qt窗体和控件遮罩效果

实现方式一:借助setMask(rect)函数。该函数将设置rect为可见区域,rect可以是控件的规则区域,也可以是bitmap范围。不规则的窗体窗体上下重叠时需要鼠标穿透、只显示部分区域时。

阿呆 1182

Qt实现半透明背景(遮罩)

实现功能 有时候我们的程序可能会需要弹出一个对话框,为了美观这个对话框后面需要半透明的遮罩。本文使用QWidget实现了一个半透明的遮罩,可以设置遮罩的大小,颜色,透明度以及遮罩内要显示的对话框,遮罩能够随着中央对话框的显示而显示,对话框的隐藏而隐藏,效果如下: 遮罩MaskForm的实现 想法是将要显示的对话框安装事件过滤器MaskForm,MaskForm拦截对话框的QEvent::Show...

急支糖浆的博客 4916
上一篇: 强大的Qtstylesheet
下一篇: qt开发中遇到的问题整理五
Qicz
博客等级 码龄15年 56粉丝 122原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值