下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

怎样防止QT视频帧显示的时候出现闪烁现象呢?

作者:Gman     来源: http://www.kokojia.com点击数:2600发布时间: 2018-03-17 16:00:04

标签: 函数前端视频面向对象

大神带你学编程,欢迎选课

  Qt是一个1991年由QtCompany开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。现在小编给大家带来的教程是:怎样防止QT视频帧显示的时候出现闪烁现象呢?

怎样防止QT视频帧显示的时候出现闪烁现象呢?_函数_前端视频_面向对象_课课家

  最近有一位朋友问小编,在使用QT进行视频帧显示的时候,究竟怎样才可以防止闪烁这一个现象出现呢?其实方法相对来说,还是比较简单的。有兴趣的朋友可以跟着小编一起来学习一下。

  正正就是因为我们需要自主控制显示视频帧,所以,需要我们自己重新实现paintEvent方法,在里面利用bitBlt方法将视频帧绘制到对应的图象区域里面,就能够直接完成视频帧的显示了。那么问题就来了?可是在实际这么做的过程里面,我们就会发现下面这一种情况:显示部分有相对来说比较严重的闪烁现象,我们究竟怎样才可以解决这一个问题呢?

  其实方法相对来说,还是比较简单的。但是如果大家不知道的话,那么大家会头疼非常长时间的。具体的操作步骤如下所示:

  操作步骤一:

  在采集完视频帧以后,我们调用paintEvent重绘视频帧的函数使用update(),然而不是repaint()。有人就会问小编,这是为什么呢?主要的原因是调用后者,Qt会马上对图形区域进行重绘,从而就会导致比较严重闪烁,而使用前者的话,Qt会对连续的update调用进行优化操作。

  换一句话来说,也就是Qt会将多个绘制事件合并为一个来加快绘制速度,当update()被调用几次又或者是窗口系统发送几次绘制事件,Qt把它们合并为一个比较大区域(在这里的话,请大家参考QRegion::unite()这一个例子哦)的一个事件里面。在这里大家都需要注意一点,那就是repaint()并不允许这样子进行优化的,所以我们只可以尽量使用update()了。

  操作步骤二:

  我们在调用bitBlt之前还需要进行设置Flags,具体的实现方法如下所示:setWFlags(getWFlags()|Qt::WRepaintNoErase);

  当我们成功设置完毕以后就可以了;

  默认的paintEvent调用,会先擦除原区域,接下来再重新进行绘制,因此每一次调用,实际上都是绘制了两次,从而就会导致闪烁非常严重了,设置这一个标记以后,就会直接进行图形绘制,然而不进行擦除,这一点就会有非常明显得改善了,是不是非常的神奇呢?

  小编结语:

  在这里小编想说的是,Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(MetaObjectCompiler,moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。

赞(11)
踩(1)
分享到:
华为认证网络工程师 HCIE直播课视频教程