2015-01-17 3 views
0

Целью является создание видеопроигрывателя с графическим интерфейсом. GUI является драйвером QML, декодированные видеофрагменты поступают из внешней (не C++) библиотеки.draw QImage in QQuickWindow :: beforeRendering

У меня запущен скрипт QML (QQmlApplicationEngine). QQmlApplicationEngine :: rootObjects возвращает список объектов, первый из которых передается QQuickWindow, а слот подключен к сигналу QQuickWindow :: beforeRendering(). Он работает так, как ожидалось.

Я могу создать QImage из необработанного пиксельного буфера, возвращаемого библиотекой видеодекодера. Как-то я хотел бы сделать этот QImage видимым в обработчике сигнала QQuickWindow :: beforeRendering(). Если мое предположение верно, тогда содержимое QML будет окрашено впоследствии, так что я получаю видеоплеер с графическим интерфейсом.

Мои вопросы:

  1. как я могу рисовать QImage в слоте beforeRendering?
  2. согласно моим наблюдениям QQuickWindow :: beforeRendering() испускается только тогда, когда что-то на сцене QML изменяется (время на повторную визуализацию). Могу ли я каким-то образом заставить QQuickWindow/QQmlApplicationEngine повторно отобразить сцену? Это необходимо в тех случаях, когда графический интерфейс не изменяется, но новый декодируется видеокадр доступен и должен быть показан ...

(я новичок в Qt)

Благодарности

+0

Берут посмотрите [этот учебник] (http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html) для 'beforeRendering()' использование. – BaCaRoZzo

+0

Я знал этот урок; это сложнее, чем мне нужно. Я бы хотел избежать программирования OpenGL (если возможно). Я думаю, что это своего рода переполнение, чтобы играть с OpenGL просто для отображения простого растрового изображения ... – tselmeci

+0

Возможно, QPainter может быть использован для этой цели ... Я еще не изучил. – tselmeci

ответ

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/