在QQuickWindow :: beforeRendering中绘制QImage

时间:2015-01-17 06:27:21

标签: qt user-interface qml qimage

目标是使用GUI实现视频播放器。 GUI是QML的驱动程序,解码的视频帧来自外部(非C ++)库。

我已经运行了QML脚本(QQmlApplicationEngine)。 QQmlApplicationEngine :: rootObjects返回一个对象列表,第一个被转换为QQuickWindow,一个插槽连接到QQuickWindow :: beforeRendering()信号。它按预期工作。

我可以从视频解码器库返回的原始像素缓冲区创建一个QImage。不知怎的,我想在QQuickWindow :: beforeRendering()信号处理程序中看到QImage。如果我的假设是正确的,那么QML内容将在之后绘制,这样我就可以获得带有GUI的视频播放器。

我的问题:

  1. 如何在beforeRendering slot中绘制QImage?
  2. 根据我的观察,QQuickWindow :: beforeRendering()仅在QML场景中的某些内容发生变化时发出(重新渲染的时间)。我可以以某种方式强制QQuickWindow / QQmlApplicationEngine重新渲染场景吗?在GUI没有改变的情况下需要这样做,但是新的解码视频帧可用并且必须显示...
  3. (我是Qt的初学者)

    由于

1 个答案:

答案 0 :(得分:0)

看来我走错了路。对我有用的正确方法是创建一个新的QML项目,然后将其放在QML文件中。新QML项目的类是负责绘制项目本身的,这是解码视频帧进入图片的位置。由于自定义QML项目的渲染器适用于FBO,我可以使用类似的东西来绘制:

QOpenGLPaintDevice device(renderSize);
QPainter painter(&device);

painter.fillRect(0, 0, 100, 200), QColor(0, 255, 0));
painter.end();
update();

从内存中显示任何类型的位图都不会有问题。

这是示例代码的链接,这是解决方案的关键:

http://doc.qt.digia.com/qt-5.1/qtquick/scenegraph-textureinsgnode.html

还有一些有趣的链接:

http://doc.qt.digia.com/qt-5.1/qtquick/qtquick-visualcanvas-scenegraph.html#mixing-scene-graph-and-opengl

http://blog.qt.digia.com/blog/2014/11/20/qt-weekly-20-completing-the-offering-qopenglwindow-and-qrasterwindow/