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

    作者:Gman更新于: 2018-03-14 19:02:27

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

      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很容易扩展,并且允许真正地组件编程。

课课家教育

未登录