前言
- 不同的項目的需求往往迥然不同,對於透明度設置更是如此,因此本文就開發過程中遇到的透明度設置問題進行小小的總結。
透明度設置
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);