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);
    

在這裏插入圖片描述

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