Я пытаюсь захватить буфер рисования qml, используя метод, указанный в этом вопросе: Захватить буфер рисования QML, без отображения
Идея заключалась в том, чтобы изменить цель визуализации перед визуализацией с использованием следующий слот подключен к сигналу beforeRendering () QQuickWindow
:
void GrabWindow::beforeRendering()
{
if (!fbo_)
{
fbo_.reset(new QOpenGLFramebufferObject( size(), QOpenGLFramebufferObject::NoAttachment) );
setRenderTarget(fbo_.data());
}
}
Рендеринг выполняется в объект буфера кадра, и этот объект используется для получения изображения
Проблема
При запуске этого решения у меня иногда бывает разный рендеринг между моим исходным QQuickView и моим QOpenGLFramebufferObject.
Например, у меня есть следующий main.qml :
import QtQuick 2.12
Item {
id:root
visible: true
width: 640
height: 480
Rectangle {
width: parent.width
height: parent.height
color: "gray"
}
Text {
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
text: "Test Text"
font.underline: true
font.pixelSize: 24
}
Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
width: 200
height: 200
border.width: 5
color: "transparent"
border.color: "black"
}
}
Когда я визуализирую этот основной qml непосредственно в QQuickView, я получаю следующий ожидаемый результат:
Когда я визуализирую этот qml main в пользовательский объект QOpenGLFramebufferObject, я получаю следующий результат: Черный прямоугольник исчезнет, и текст больше не будет подчеркнут.
Если я установлю цвет прямоугольника root на прозрачный, проблема будет решена. Похоже, что прямоугольник root скрывает некоторые объекты.
Есть ли разница между двумя способами рендеринга, которая могла бы объяснить эту проблему?