测试使用qt 版本5.11
视频窗体上设置透明控件可参考我另外一片博文https://blog.csdn.net/qiushangren/article/details/81035544
qt的窗体上如果用d3d 或opengl渲染的视频窗口,在上面添加子控件出问题(不显示子控件或无法设置子控件或不方便设置),可以将透明窗体叠放(overlap)到视频窗体上,叠放的意思是让透明操控窗体作为显示视频窗体的同级窗体,及父窗体相同。
方式如下。
1、qt中如果添加的同级窗体传入父窗体指针,会导致透明时显示的是父窗体的背景。所以不传入父窗体指针。
2、子窗体创建时,添加 subwindow属性。这样就不会在任务栏上显示多个窗体icon,不使用“Qt::WindowStaysOnTopHint
”属性, 该属性让窗体在显示时一直保持在最前面,比较难用。设置透明方式中,使用setpalette方式,在此时会导致透明控件所在窗体背景不透明,不知道原因,但是下面的方式能够让控件透明并看到下面的视频。
m_tranParentWidget->setWindowFlags(Qt::FramelessWindowHint|Qt::SubWindow);//|Qt::WindowStaysOnTopHint
m_tranParentWidget->setAttribute(Qt::WA_TranslucentBackground, true);
3、重载paintevent
void VideoController::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
painter.fillRect(this->rect(), m_color);
}
4、重定义主窗体中的mousemoveevent(当鼠标移动到视频窗口上时,让显示透明控件的窗体显示,否则隐藏)
void MMSMainWindow::mouseMoveEvent(QMouseEvent *event)
{
if(m_tranParentWidget->geometry().contains(event->pos()))
{
m_tranParentWidget->show();
}else
{
m_tranParentWidget->hide();
}
}
5、重定义主窗体的moveevent(当窗体移动时,将透明控件窗体进行移动,慎用setGeometry(),容易出错)
void MMSMainWindow::moveEvent(QMoveEvent *event)
{
QMainWindow::moveEvent(event);
qDebug()<<event->pos()<<endl;
m_tranParentWidget->move(event->pos());
}