Qt窗口透明设置与窗口的父子关系

前言

  • 不同的项目的需求往往迥然不同,对于透明度设置更是如此,因此本文就开发过程中遇到的透明度设置问题进行小小的总结。

透明度设置

setWindowOpacity

  • 可以改变当前窗口的透明度,但是该窗口的子控件都会变透明
    setWindowOpacity

setAttribute

  • 使用setAttribute(Qt::WA_TranslucentBackground),可以将窗口设置成完全透明,但是不可以设置成半透明。
  • 使用setAttribute(Qt::WA_TranslucentBackground)设置窗口透明,需要同时将窗口设置成无边框。
  • 这种方法设置后窗口将完全透明,鼠标将穿透窗口,但子控件正常显示,不受影响。

QPainter和painterEvent

  • 使用QPainter设置窗口透明度,需要先用setAttribute的办法将窗口设置成完全透明,然后在透明窗口上绘制上自定义的透明颜色。
// 窗口无边框
this->setWindowFlag(Qt::FramelessWindowHint);
// 窗口透明
this->setAttribute(Qt::WA_TranslucentBackground);

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    painter.setCompositionMode(QPainter::CompositionMode::CompositionMode_Source);
    painter.fillRect(this->rect(), QColor(255, 0, 0, 50));
}

!在这里插入图片描述

QPalette

  • 如果控件是独立的桌面窗口部件,那么这样设置是无效的,需要用到前面的painterEvent。

  • 如果父窗口不是透明的,那么这种设置也是无效的。
    )* 如果窗口是子控件,那么需要父窗口是透明的setAttribute(Qt::WA_TranslucentBackground);那么可以生效

  • 如果该窗口是子控件,可以通过代码修改,也可以直接在ui设计器中更改

  • 另外如果是输入窗口,比如QTextEdit等,同样还需要设置成无边框才能生效:ui->textEdit->setFrameStyle(QFrame::NoFrame);

    palette = ui->widget->palette();
    palette.setColor(backgroundRole(), QColor(0, 0, 255, 50));
    ui->widget->setPalette(palette);
    ui->widget->setAutoFillBackground(true);
    
    ui->textEdit->setFrameStyle(QFrame::NoFrame);
    palette = ui->textEdit->palette();
    palette.setColor(QPalette::Base, QColor(0, 255, 0, 20));
    ui->textEdit->setPalette(palette);
    

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章