我正在尝试实现自定义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合作的工具(在我的情况下为Visualization Library),则其中一个可能会崩溃(在我的情况下是VL,它检查是否在每个帧之前清除了上下文状态)。

最佳答案

有一个实验室示例将Qt widgets using opengl渲染的有些旧,我还没有使用4.8中改进的qglwidget尝试过

在全屏QGLwidget上方绘制还存在一个问题-据说这是NVidia的openGL驱动程序中的错误。似乎还没有解决
https://bugreports.qt-project.org/browse/QTBUG-7556

关于qt - 用于图形的QGLWidget和用于GUI的QT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8675065/

10-11 16:10