1. 程式人生 > >qt 子窗體透明 不受父窗體背景影響 播放視訊

qt 子窗體透明 不受父窗體背景影響 播放視訊

使用qt版本 qt5.11.0 windows10 平臺

設定子窗體透明的方式很多。但是很多方式在有些情況下效果卻很糟。

如果父窗體上播放視訊操作,或其他有修改窗體swichbuffer的行為時,透明效果需要做點小操作。

1、首先如果希望透明子窗體要時時刻刻在父窗體上顯示,需要繼承父窗體指標,再呼叫raise()。
2、讓父窗體不影響子窗體,需要修改窗體flag值。Qt窗體型別有三種,一種是Qt::widget,一種是Qt::dialog,一種是Qt::window ,widget 會強制使用父窗體背景,所以會選擇Dilog或window flag。
3、WindowstaysOnTopHint會讓窗體一直保持在最上面。如果不繼承父窗體, 則會一直在最上面。並且需要設定SubWindow flag,才能保證在工作列上該程式只顯示一個圖示。

m_videoController  = new VideoController(this);
m_videoController->setWindowFlags(Qt::FramelessWindowHint|Qt::Dialog);
m_videoController->setAttribute(Qt::WA_TranslucentBackground, true);
m_videoController->show();
//QPalette pal;​
//pal.setColor(QPalette::Background,QColor(90,90,90,90));
//m_videoController->setAutoFillBackground(true);
//m_videoController->setPalette(pal);​


解釋: 上面setAttribute WA_TranslucentBackground 為true,表示子視窗透明時不會考慮父視窗,否則底層會將父視窗原始的framebuffer中的畫素作為結果顯示,而不是自己設定的顏色。

4、再過載透明子widget的paintevent(Qpaintevent *e)

void VideoController::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);
    painter.fillRect(this->rect(), m_color);
}

這樣子窗體就能透明瞭。