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