我正在使用Qt 5.4,QtQuick 2.4。
基本上,我希望能够将原始OpenGL渲染到用QtQuick / QML编写的应用程序中,我希望在使用QQmlApplicationEngine
时这样做。
我经历过的主要教程是(貌似)非常标准的教程,here。
但是,本教程使用QQuickView
而不是QQmlApplicationEngine
来加载QML UI。如果我将代码更改为使用QQmlApplicationEngine
,则GL渲染不再有效,我真的不明白为什么。
this GitHub存储库中的代码承诺使用QQmlApplicationEngine将原始OpenGL绘制到QtQuick应用程序中,甚至设法保留这一承诺,但它是通过挂钩QQuickWindow::afterRendering
来实现的(见第79行) squircle.cpp
)。如果此信号/插槽连接更改为挂钩到QQuickQindow::beforeRendering
,则场景的GL部分将再次显示为未渲染。这是IMO最简单的例子,它可以重现我遇到的问题(除了一些样板文件)。
QQuickWindow::clearBeforeRendering
似乎(正确)设置为false(同一文件的第86行)。
我错过了什么吗?
答案 0 :(得分:3)
升级到Qt 5.4时遇到同样的问题。我找到的解决方法是更改主QML ApplicationWindow项目的背景颜色。
... Main.qml
ApplicationWindow
{
id: mainWindow
width: 800
height: 600
color: "black"
在color属性中添加“white”以外的任何内容对我有用。由于某些原因,当尝试使用beforeRendering()信号在QQuickItem中使用OpenGL进行绘制时,使背景白色会覆盖setClearBeforeRendering(false)。
使用什么颜色并不重要,因为你必须在自定义OpenGL代码中使用glClear清除背景,这将是绘图完成时看到的那个。
请勿使用白色!
我认为这是一个错误,直到有人告诉我。
答案 1 :(得分:2)
在Qt 5.4中,引入了Window.contentItem
属性,并更改了ApplicationWindow
内容区域的绘制。我使用了从QQuickFramebufferObject
派生的自定义项来修复它。您可以在GitHub找到示例。
在我的示例中,当未定义FBO__
宏时,使用QtQuick Scenegraph OpenGL-under-Qml示例中的代码。并且setClearBeforeRendering(false)
不再起作用了。我相信当{GUI渲染发生时ApplicationWindow
会删除整个窗口背景。我有一个想法以某种方式(通过flags
属性和事件处理程序)拦截擦除背景事件,但仍然没有执行它。基于QQuickFramebufferObject
的自定义项工作正常,但我认为与QQuickQindow::beforeRendering()
中的绘制相比,它具有内存开销。