qt 窗体 重叠(overlap) 透明 视频

测试使用qt 版本5.11

用d3d 或opengl渲染的视频窗口无法在其上面添加控件,必须添加同级的窗口进行叠放(overlap)。

如果想添加透明控件放在进行视频显示的窗体上,需要用如下方式。

1、qt中如果添加的同级窗体传入父窗体指针,会导致透明时显示的是父窗体的背景。

所以不能传入父窗体指针。

2、子窗体创建时,添加 subwindow属性。这样就不会再任务栏上显示多个窗口,不使用“

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

猜你喜欢

转载自blog.csdn.net/qiushangren/article/details/80832064