我正在尝试实现自定义OpenGL场景(包装在QGLWidget中),但仍然使用QT控件(如滑动条和按钮)。我试图让我的主要小部件成为QGLWidget,它有QWidgets作为孩子。子窗口小部件似乎工作(当我单击下拉菜单时,其选项出现),但窗口小部件无法绘制(我看到一个白色方块)。我将我的子窗口小部件的基类从QWidget更改为QGLWidget,现在QPainter调用工作,但QT GUI的东西仍未显示......
有人声称QGLWidget不能将QWidgets作为孩子...我不确定,我不愿意放弃。顺便说一句,我使用Visualization Library来绘制OpenGL场景,但它只是一个OpenGL包装器......
可能出现问题的任何线索?此外,当我将子窗口小部件添加到GQLWidget时,关键事件由于某种原因停止处理。
更新 我尝试了各种小部件和布局组合。似乎QGLWidget只是被绘制在任何东西之上。我甚至尝试使用raise()来安排小部件的Z深度,但无济于事。 overlayGL()是在OpenGL小部件之上绘制的唯一方法吗?
更新2 经过几个月的尝试,我发现它与QT有关。每当在另一个QGLWidget上绘制QGLWidget时,不会调用第一个的background()函数。所以一个按钮就在那里,可以点击,但它没有画出来。我的解决方法是使用QPainter自己绘制所有内容 - 这很有效。我发现很奇怪的是,必须使用QPainter :: startNativePainting()来绘制它。可以预期,只要QGLWidget是绘图设备,他们就会在QPainter中重载start()来调用startNativePainting()...
另一个(可能有用的)事实是QPainter调用CHANGE Opengl上下文。因此,如果您有另一个与QPainter合作的工具(在我的案例中是可视化库),很可能其中一个会崩溃(在我的情况下,VL检查在每个帧之前是否已清除上下文状态)。
答案 0 :(得分:2)
有一个实验室示例渲染Qt widgets using opengl它有点老了我还没有用4.8中改进的qglwidget尝试它
在全屏QGLwidget的顶部绘制也存在问题 - 据说它是NVidia的openGL驱动程序中的一个错误。它似乎没有得到解决 https://bugreports.qt-project.org/browse/QTBUG-7556
答案 1 :(得分:1)
如果我是你,我会使用QGLWidget
作为QGraphicsScene
的视口,然后您可以使用QGraphicsProxyWidget
绘制小部件。这样你就可以得到一个合适的OpenGL视口,能够轻松地放置小部件并对其进行操作。
答案 2 :(得分:0)
您是否尝试过显式调用update()?我发现有时QGLWidget更新显示的东西有点慢。
答案 3 :(得分:0)
这是一个老问题,但我最近遇到了很多麻烦,这对我有帮助 -
使用QML / QT Quick。 QML是一种类似javascript的语言,允许您在窗口上布局窗口小部件元素,并对鼠标单击等事件进行基本处理。还有一些其他很酷的功能,但与此问题最相关的功能是您可以从C ++代码导入qt小部件。
因此,您可以创建自定义QGLWidget,将其导入QML窗口,并在任何您想要的任何地方设置大小/位置/棒小部件,非常容易。 QT的Scenegraph示例解释了这一点。至少在Qt Creator 3.2.1开源中也包含了场景图的代码(这是我的版本)