使用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);
m_color = QColor(0,0,0,1);//全透无法响应鼠标事件。
解释: 上面setAttribute WA_TranslucentBackground 为true,表示子窗口透明时不会考虑父窗口,否则底层会将父窗口原始的framebuffer中的像素作为结果显示,而不是自己设置的颜色。
4、再重载透明子widget的paintevent(Qpaintevent *e)
void VideoController::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
painter.fillRect(this->rect(), m_color);
}
这样子窗体就能透明了。