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

测试使用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()<pos()<move(event->pos());
}

 

你可能感兴趣的:(qt)