Qt设置窗体透明

这几天研究了下Qt关于窗体透明的方法,不同的方法有着不同的效果,今天在此总结一下。界面结构如下:
Qt设置窗体透明_第1张图片

全透明

setWindowOpacity(double value)。该函数用来设置窗体透明度,有效范围从1.0到0.0,并且会影响子控件。默认情况下,此属性的值是1.0(不透明)。

//全透明
setWindowOpacity(0.7);
Qt设置窗体透明_第2张图片

子控件透明

使用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设置窗体透明_第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设置窗体透明_第4张图片

情况二:背景有图片。仍然使用属性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);
}
Qt设置窗体透明_第5张图片

注:若设置背景属性失败,可尝试设置该属性解决,setAttribute(Qt::WA_StyledBackground);。

你可能感兴趣的:(qt)