Qt笔记(四十四)之Qt实现窗口透明方式集合

104 篇文章 127 订阅

一.前言
楼主最近在开发一款工具,需要用到窗口的透明化,于是上网百度研究了下,发现零零碎碎,有很多都存在一个问题,就是设置透明之后,那一块区域黑色的问题,然后很多也没有最终解决,楼主就这个做一个整合,真正实现透明化,并且不会有黑色的问题

二.透明化方式
方式1:
效果:窗口整体会透明,但窗口子控件不透明,QLabel只显示字体,控件背景色透明

// 这两句要加,不然就会出现黑色,可以自己注释看效果
    setAttribute(Qt::WA_TranslucentBackground);
    setWindowFlags(Qt::FramelessWindowHint);

    // 方式1
    QPalette palette = QPalette();
    palette.setColor(QPalette::Background, QColor(0x00,0xFF,0x00,0x00));
    setPalette(palette);

方式2:利用setWindowOpacity

void OpacityWidget::onValueChanged(QString str)
{
    qreal a = str.toInt();
    this->setWindowOpacity(a/10);
}

效果:
在这里插入图片描述
踩坑:
不要用int 不要用int ,不然会设置没效果,要用qreal

方式3:paintEvent绘制,这个可以实现局部窗口透明

void OpacityWidget::paintEvent(QPaintEvent *e)
{
    int width = this->width()-100;
    int height = this->height()-100;

    // 透明的区域
    QRect rect(3,35,width-20,height);
    QPainter painter(this);
    painter.setPen(Qt::NoPen);

    // 非透明区域的颜色
    painter.setBrush(Qt::magenta);
    painter.drawRoundedRect(this->rect(),5,5);

    painter.setCompositionMode(QPainter::CompositionMode_Clear);
    painter.fillRect(rect,Qt::SolidPattern);
}

踩坑:
上述代码直接运行之后就是如下效果,很明显这不是我们先要的,起码那可一块黑色不行
在这里插入图片描述
解决方式:
构造函数里面添加

 
    //  这两句要加,不然就会出现黑色,可以自己注释看效果
    setAttribute(Qt::WA_TranslucentBackground);
    setWindowFlags(Qt::FramelessWindowHint);

在这里插入图片描述

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值