前言
- 不同的项目的需求往往迥然不同,对于透明度设置更是如此,因此本文就开发过程中遇到的透明度设置问题进行小小的总结。
透明度设置
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);