2011-12-30 49 views
5

我想实现一个自定义的OpenGL场景(包装在一个QGLWidget),但仍然使用QT控件(如滑动条和按钮)。我试图让我的主窗口小部件成为一个QGLWidget,它有QWidgets作为孩子。子窗口小部件似乎工作(当我点击一个下拉菜单,它的选项出现),但小部件无法绘制(我看到一个白色的正方形)。我将我的子窗口小部件的基类从QWidget更改为QGLWidget,现在QPainter调用工作,但是QT GUI的东西仍然不显示...QGLWidget图形和QT的GUI

某些人声称QGLWidget不能将QWidgets作为儿童使用... I我不确定,我不愿意放弃。顺便说一句,我使用可视化库来绘制OpenGL场景,但它只是一个OpenGL包装...

任何线索的问题可能是什么?此外,当我将子小部件添加到GQLWidget时,关键事件因某种原因而停止处理。我试过各种组件和布局的组合。看起来QGLWidget只是在任何东西上绘制而成。我甚至尝试用raise()来安排小部件的Z深度,但没有用。 overlayGL()是在OpenGL小部件顶部绘制的唯一方法吗?

更新2 经过数月的尝试,我发现它与QT有关。每当QGLWidget绘制在另一个QGLWidget的顶部时,第一个的background()函数就不会被调用。所以一个按钮在那里,可以点击,但它没有绘制。我的解决方法是使用QPainter自己绘制所有东西 - 这很有效。我发现好奇的是,必须使用QPainter :: startNativePainting()才能绘制它。人们会认为当QPainter是绘画设备时,它们会重载QPainter中的start()以调用startNativePainting()...

另一个(也许有用的)事实是QPainter调用了更改Opengl上下文。所以如果你有与QPainter合作的另一种工具(在我的例子中是Visualization Library),它们中的一个会崩溃(在我的例子中,VL检查上下文状态是否在每帧之前被清除)。

+0

您是否可以创建一个非GL窗口小部件作为主窗口,以及一个GL窗口小部件,因为它是子窗口?因此,您窗口中需要的其他控件将是GL窗口的兄弟和表兄弟,而不是儿童。 – 2011-12-30 01:17:56

+0

我首先尝试过 - 它无法抱怨某些GL_SRC_ALPHA问题。 QGLWidget由VL [link](http://www.visualizationlibrary.org/)构建,非常复杂,因此很难调试... – 2011-12-30 03:11:16

+0

您是否试图让QWidget派生对象漂浮在QGLWidget的顶部? – cmannett85 2011-12-30 10:10:30

回答

0

您是否尝试明确调用update()?我发现有时QGLWidget更新显示的东西有点慢。

+0

是的,QGLWidgets调用显式更新()。我怀疑绘图顺序是不正确的,但我不知道QT如何处理小部件绘图以及它如何/必须受到影响... – 2011-12-31 16:35:13

+0

您可以使用一些简单的opengl func来绘制一些基本的几何图形,如球体或茶壶?只是为了确保QGLWidget能够正确地绘制一些东西。如果它有效,那么这意味着你使用的lib有一些错误。 – NullSpace 2011-12-31 22:30:48

+0

问题不在于未绘制openGL场景。问题在于它在正常QWidgets的顶部**上绘制。 – 2012-01-09 14:43:49

1

如果我是你,我会用QGLWidget作为一个视口的QGraphicsScene,那么你就可以得出使用QGraphicsProxyWidget你的部件。这样你就可以获得一个合适的OpenGL视口,并且可以轻松地放置小部件并对其进行操作。

+0

我也试过,它可以工作,但不适合我的场景。我给我的QGLWidget作为视口到GGraphicsView(呈现我的QGraphicsScene),但它失败并带有错误(本质上,QGraphicsScene抱怨GLContext为null)。我认为这与我的QGLWidget具有自定义上下文这一事实有关... – 2012-01-25 13:51:20

+0

可能是OpenGL支持Qt需要,您没有。你可以发布你的QGLContext代码和你正在运行的OpenGL版本吗? – cmannett85 2012-01-25 14:23:12

+0

'QGLContext * glctx = new QGLContext(context() - > format(),this); QGLFormat fmt = context() - > format(); //在fmt中设置各种格式参数 glctx-> setFormat(fmt); glocx-> create(shareContext); setContext(glctx); ' – 2012-01-30 13:20:35

0

这是一个老问题,但我最近有相当多的这种麻烦,这是帮助我 -

使用QML/QT快速。 QML是一种类似JavaScript的语言,它允许您在窗口上布局窗口小部件元素,并对鼠标点击等事件进行基本处理。还有一些很酷的功能,但与这个问题最相关的是你可以从C++代码中导入qt小部件。

所以你可以制作一个自定义的QGLWidget,将它导入到QML窗口中,并且可以非常容易地在任何你想要的位置上设置它的大小/位置/小部件。 QT的Scenegraph例子很好地解释了这一点。 Scenegraph的代码也作为一个例子,至少包括Qt Creator 3.2.1开源代码(这是我的版本)