图形使用QGLWidget,界面使用QT。

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

有人声称QGLWidget不能有QWidget作为子项...我不确定这一点,也不想放弃。顺便说一句,我正在使用可视化库来绘制OpenGL场景,但它只是一个OpenGL包装器...

问题可能出在哪里?此外,当我向GQLWidget添加子窗口小部件时,键事件停止被处理,原因不明。

更新: 我尝试了各种小部件和布局的组合。看起来QGLWidget只是在顶部绘制任何内容。我甚至尝试过raise()来排列小部件的Z深度,但没有效果。overlayGL()是在OpenGL小部件上方绘制的唯一方法吗?

更新2: 经过数月的尝试,我发现它与QT有关。每当一个QGLWidget在另一个QGLWidget上方绘制时,第一个的background()函数不会被调用。因此,按钮在那里可以被单击,但没有被绘制。我的解决方法是使用QPainter自己绘制所有内容-这很有效。我发现有趣的是,人们必须使用QPainter::startNativePainting()才能进行绘制。人们期望他们会在QPainter中重载start(),以便在QGLWidget成为绘图设备时调用startNativePainting()...

另一个(可能有用的)事实是,QPainter调用更改了Opengl上下文。因此,如果您有与QPainter合作的另一个工具(在我的情况下是可视化库),则其中一个将崩溃(在我的情况下,VL检查每个帧之前是否清除了上下文状态)。


你能不能创建一个非GL小部件作为主窗口,然后将一个GL小部件作为它的子级?这样,你想要在窗口中添加的其他控件将成为GL窗口的兄弟姐妹而不是子级。 - Nicol Bolas
我首先尝试了那个 - 它失败了,抱怨一些GL_SRC_ALPHA问题。QGLWidget由VL 链接构建,非常复杂,因此很难调试... - Violin Yanev
你是否尝试让QWidget派生的对象浮动在QGLWidget之上? - cmannett85
这正是我想要做的! - Violin Yanev
4个回答

2

1
如果我是你,我会使用QGLWidget作为QGraphicsScene的视口,然后使用QGraphicsProxyWidget绘制小部件。这样,您就可以获得一个适当的OpenGL视口,并能够轻松地放置和操作小部件。

我也尝试过这种方法,它确实可行,但不适用于我的情况。我将我的QGLWidget作为GGraphicsView的视口(用于渲染我的QGraphicsScene),但出现了错误(基本上,QGraphicsScene抱怨GLContext为空)。我认为这与我的QGLWidget具有自定义上下文有关... - Violin Yanev
可能是Qt需要的OpenGL支持您没有安装。您能否发布您的QGLContext代码以及您正在运行的OpenGL版本? - cmannett85
`QGLContext* glctx = new QGLContext(context()->format(), this); QGLFormat fmt = context()->format();//setting various format marameters in fmtglctx->setFormat(fmt); glctx->create(shareContext); setContext(glctx); ` - Violin Yanev
格式有些混乱,请编辑您的帖子以添加此内容,以便每个人都能注意到它。重要的是在context()->format()中请求了哪些OpenGL功能,使用glctx->format()查看。另外,您的显卡支持哪个OpenGL版本? - cmannett85
我尝试编辑它,但它显示该帖子已经被编辑过了... 我请求的功能正在使用中。我找到了问题的根源,并将其添加到主要问题中。在我看来,这显然是一个QT问题... - Violin Yanev

0

你尝试过显式调用update()吗?我发现有时候QGLWidget更新显示的东西会比较慢。


是的,QGLWidgets 明确调用了 update()。我怀疑绘制顺序有问题,但我不知道 QT 如何处理小部件绘制以及如何/必须影响它... - Violin Yanev
你能否使用一些简单的OpenGL函数来绘制一些基本几何图形,比如球体或茶壶?只是为了确保QGLWidget能够正确地绘制一些内容。如果它能正常工作,那就意味着你所使用的库存在一些错误。 - NullSpace
问题不在于OpenGL场景没有被绘制出来,而是它被绘制在普通的QWidgets之上。 - Violin Yanev

-1

这是一个老问题,但我最近遇到了一些麻烦,以下是帮助我的方法 -

使用QML/QT Quick。QML是一种类似于JavaScript的语言,允许您在窗口上布局小部件元素并对诸如鼠标单击之类的事件进行基本处理。还有一些其他很酷的功能,但与此问题最相关的是,您可以从C++代码中导入qt小部件。

因此,您可以制作自定义的QGLWidget,将其导入到QML窗口中,并以任何您想要的方式设置大小/位置/粘贴小部件在其上面,非常容易。QT的Scenegraph示例很好地解释了这一点。 Scenegraph的代码也包含在至少Qt Creator 3.2.1 Open Source(那是我拥有的版本)中作为示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接