【发布时间】:2011-12-30 00:47:07
【问题描述】:
我正在尝试实现自定义 OpenGL 场景(包装在 QGLWidget 中),但仍然使用 QT 控件(例如滑动条和按钮)。我试图让我的主要小部件成为一个 QGLWidget,它有 QWidgets 作为孩子。子小部件似乎可以工作(当我单击下拉菜单时,会出现其选项),但小部件无法绘制(我看到一个白色方块)。我将我的子小部件的基类从 QWidget 更改为 QGLWidget,现在 QPainter 调用工作,但 QT GUI 的东西仍然没有显示......
有些人声称 QGLWidget 不能将 QWidgets 作为孩子...我不确定,我也不愿意放弃。顺便说一句,我正在使用可视化库来绘制 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 会检查是否在每一帧之前清除了上下文状态)。
【问题讨论】:
-
你不能创建一个非 GL 小部件作为主窗口,并创建一个 GL 小部件作为它的子窗口吗?因此,您希望窗口中的其他控件将是 GL 窗口的兄弟和表亲,而不是子窗口。
-
我先试过了——它抱怨一些 GL_SRC_ALPHA 问题失败了。 QGLWidget 由 VLlink 构建,非常复杂,因此很难调试...
-
你想让 QWidget 派生的对象漂浮在 QGLWidget 的顶部吗?
-
这正是我想要做的!