Я использую QtQuick с пользовательским средством визуализации OpenGL (настраиваемым с точки зрения QtQuick, поскольку это просто OpenSceneGraph) . Для этого я создаю пользовательский QQuickItem, наследуемый от QQuickFramebufferObject, который, в свою очередь, создает пользовательский модуль визуализации, наследуемый от QQuickFramebufferObject::Renderer в QQuickFramebufferObject::Renderer strong>QQuickFramebufferObject::createRenderer(). Это хорошо задокументировано, и с этими шагами проблем не возникает.
Теперь происходит то, что для последующего доступа средство визуализации, созданное в QQuickFramebufferObject::createRenderer(), фактически кэшируется (фактически создается в конструкторе QQuickFramebufferObject и просто возвращается в QQuickFramebufferObject::createRenderer(). Это прекрасно работает, и я не вижу другого простого способа закодировать его, поскольку созданный модуль визуализации позже используется для реагирования на такие события, как geometryChanged. или mousePressEvent, например.
////////////////////////////////////////////////////////////////////////////////
void OsgItem::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry)
{
if (m_renderer)
m_renderer->m_window->getEventQueue()->windowResize(newGeometry.x(), newGeometry.y(), newGeometry.width(), newGeometry.height());
QQuickFramebufferObject::geometryChanged(newGeometry, oldGeometry);
}
////////////////////////////////////////////////////////////////////////////////
void OsgItem::mousePressEvent(QMouseEvent *event)
{
m_renderer->m_window->getEventQueue()->mouseButtonPress(event->x(), event->y(), button(*event));
update();
}
, где OsgItem — это мой пользовательский QQuickFramebufferObject, а m_renderer — мой пользовательский QQuickFramebufferObject::Renderer.
Проблема в том, что createRenderer() является константой (что на самом деле не является приглашением к кэшированию) и эта статья четко указывает, что средство визуализации не должно кэшироваться (хотя это не указано в официальный документ).
В чем тут подвох? Есть ли что-то, что я пропустил? Можете ли вы увидеть другой чистый способ, которым я мог бы кодировать вещи?