这几天研究了下Qt关于窗体透明的方法,不同的方法有着不同的效果,今天在此总结一下。界面结构如下:
setWindowOpacity(double value)。该函数用来设置窗体透明度,有效范围从1.0到0.0,并且会影响子控件。默认情况下,此属性的值是1.0(不透明)。
//全透明 setWindowOpacity(0.7);使用Qt样式表,background:rgba(r,g,b,opacity),rgb是颜色值,opacity是设置为半透明的透明度,有效范围从1.0到0.0。使用样式表设置一张背景图,widget和label的透明度,关于样式表可以在Qt Designer进行设置。(设置透明度要指定对象,避免影响其他控件)
//子控件透明 this->setStyleSheet("#centralWidget{border-image:url(://timg.jpg);}" "#label{background:rgba(255,255,0,0.4);}" "#widget{background:rgba(255,0,0,0.3);}");情况一:背景无图片。设置属性Qt::WA_TranslucentBackground将MainWindow变为全透明,在windows上这个属性需配合Qt::FramelessWindowHint使用。然后设置centralWidget样式中的opacity调节父窗口的透明度并设置子控件的不透明。
this->setWindowFlags(Qt::FramelessWindowHint);//需要去掉标题栏 this->setAttribute(Qt::WA_TranslucentBackground); this->setStyleSheet("#centralWidget{background:rgba(0,255,255,0.4);}" "#label{background:rgba(255,255,0,1);}" "#widget{background:rgba(0,255,255,1);}");情况二:背景有图片。仍然使用属性Qt::WA_TranslucentBackground将MainWindow变为全透明。然后在paintevent中将图片绘制在窗体上,并设置透明度。
void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this); QPixmap pix("://timg.jpg"); QPixmap scalePix = pix.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); painter.setOpacity(0.4); painter.drawPixmap(0, 0, scalePix); }注:若设置背景属性失败,可尝试设置该属性解决,setAttribute(Qt::WA_StyledBackground);。