异想天开

What's the true meaning of light, Could you tell me why

Qt设置窗体透明

日期:2020-09-18 12:02:42
  
最后更新日期:2020-09-18 12:09:24
目前实验出几种方法,可以设置窗体透明。 首先考虑窗体是否真需要透明,还是需要不规则的控件形状。如果是不规则的控件形状,那么透明部分, 就真透明了,不会触发键盘和鼠标消息,否则的话,就是期望做个蒙板盖住窗体,窗体就还能接收正常的消息。

第一种方法, 全局设置窗体的透明度
setWindowOpacity(0.01);
0.01表示不透明的系数为0.01,意思就是几乎透明的效果。 这样设置后, 是窗体内的所有都设置为透明,包括子控件以及paintevent画出来的控件。这样做有点过于粗鲁。


第二种方法, 设置窗体背景透明
正常情况下, 如果直接用paintevent是画在窗体灰色的背景上面,即使画的内容本身是透明的,那么实际看起来,也不是透明,就需要将窗体背景设置为透明。用如下函数:
this->setAttribute(Qt::WA_TranslucentBackground, true);
这样再用paintevent里面,画一个透明的矩形当画布,再在上面画控件,类似这样:
[code lang="cpp"]
QPainter p(this);
p.setBackgroundMode(Qt::TransparentMode);

//p.setOpacity(0.01);
//这个alpha值 0表示透明, 255表示不透明
QColor tc(255, 0, 0, 1);
QBrush bgbrush(255, 0, 0, 1); //透明画布
bgbrush.setColor(tc);
QBrush mybrush(QColor(0, 255, 0, 255));

QRect rec1(0, 0, width(), height());
p.fillRect(rec1,bgbrush);

p.fillRect(QRect(0,0,100,100),mybrush);
[/code]