Лучший способ интеграции своего OpenGL с QML

У меня есть картографическое приложение. Основной класс приложения наследуется от QQuickPaintedItem и использует QPainter для рендеринга. Поверх карты - обычный QML интерфейс. Сейчас я хочу начать использовать OpenGL для отрисовки карты. Как я поступил: наследовался от QQuickItem, и используя сигнал beforeRendering - рисую напрямую в контекст QWindow.

  void ChartPlotter::sync()
{
    if (!m_renderer) {
        m_renderer = new Renderer(this);
        connect(window(), &QQuickWindow::beforeRendering, this, &ChartPlotter::paint, Qt::DirectConnection);
    }
    m_renderer->setViewPortSize(window()->size());
}

void ChartPlotter::paint () {
    m_renderer->paint(); // Здесь весь мой кастомный рендеринг 
    window()->resetOpenGLState(); // Восстанавливаю состояние
}

В принципе это работает, но есть ряд проблем: на одном из тестируемых Android устройств, пропадает весь текст в стандартных QML элементах, работающих поверх моей карты. Такая проблема только на одном устройстве. Я так понимаю что причина так или иначе кроется во "влезании" в контекст рендеринга всей QML сцены. Мне хотелось бы избежать таких сюрпризов. Есть и другие странности, но слишком долго их описывать.

Смотря одну из презентаций Qt Company, посвященной интеграции OGL в QML, я увидел что есть второй способ: Наследование от QQuickFramebufferObject и QQuickFramebufferObject::Renderer. Рендерер рисует себе в свой фрейбуфер, который и отображается потом на сцене. QQuickFramebufferObjectточно также как и QQuickItem регистрируется как тип и инстанцируется уже в самом QML. Но, есть одно НО(!) QQuickFramebufferObject не способен принимать жесты и события мыши, в отличие от QQuickItem. Я не знаю как лучше сделать. Какая практика лучше в данном случае.


Ответы (0 шт):