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()<<event->pos()<<endl;
    m_tranParentWidget->move(event->pos());
}

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要筛选出重叠的任务,并使任务的重叠部分透明,你可以使用 dhtmlx gantt 中的 gantt.getTaskByTime 函数和 gantt.addTaskLayer 函数。 首先,你可以使用 gantt.getTaskByTime 函数来获取与指定任务时间段重叠的所有任务。然后,你可以使用 gantt.addTaskLayer 函数为任务添加一个图层,在该图层中绘制任务的重叠部分。 下面是一个示例代码: ```javascript // 添加一个图层 gantt.addTaskLayer(function drawOverlapping(task, container) { // 获取与指定任务时间段重叠的所有任务 var overlaps = gantt.getTaskByTime(task.start_date, task.end_date); // 遍历重叠的任务,为其添加一个特殊的 CSS 类 overlaps.forEach(function(overlap) { if (overlap.id != task.id) { container.querySelector(".gantt_task_line").classList.add("gantt_task_overlapping"); } }); return true; }); // 定义一个 CSS 类,用于表示任务的重叠部分 .gantt_task_overlapping { background-color: rgba(255, 0, 0, 0.2); } ``` 以上代码中,我们首先使用 gantt.addTaskLayer 函数为任务添加一个图层,然后在该图层中使用 gantt.getTaskByTime 函数获取与指定任务时间段重叠的所有任务。接着,我们遍历重叠的任务,为其添加一个特殊的 CSS 类 "gantt_task_overlapping",从而使其在重叠部分透明。 注意,以上示例代码仅供参考,具体实现方式可能需要根据你的实际需求进行调整。同时,由于需要通过 JavaScript 动态地为任务设置样式,因此在性能方面可能会有些影响,你需要根据实际情况进行优化。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值