Лучший способ интеграции своего 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. Я не знаю как лучше сделать. Какая практика лучше в данном случае.