Qt和OSG集成问题,场景图消失了

时间:2012-05-12 02:58:19

标签: c++ qt opengl openscenegraph

所以我在整合QT和OSG时遇到了问题。我有一个QT / OSG程序,工作正常。布局与您在下面看到的相似。

|--------------------------|
|  1   |         2         |
|      |                   |
|      |                   |
|      |                   |
|      |                   |
|      |                   |
|      |-------------------|
|      |         3         |
|      |                   |
|--------------------------|

中央窗口小部件由一个QFrame组成,它有三个子窗口小部件并使用网格布局。小部件1是具有网格布局的QFrame。小部件2是OSG查看器,如下所述。小部件3是一个QFrame,也有网格布局。

两个填充了在osgviewerQT.cpp中的示例之后建模的窗口小部件。基本上它使用嵌入式窗口,我有一个QTimer,每10毫秒触发一次,并调用osg框架函数。

我还有其他4个小部件。我动态填充的两个QLabel和两个QTable。我一直在将这四个小部件添加到1的网格布局中。当我这样做时,一切都很好,我在2中得到了我很好的场景图。如果我做了一个更改,将这四个小部件从1移动到2的网格布局突然我的场景图消失了。出了什么问题?我已经检查了valgrind所以我很确定它不是内存问题,而是我如何使用lib。我已经确认正在调用帧功能。

2 个答案:

答案 0 :(得分:3)

我找到了一个解决方案:您必须为查看器控件添加大小提示。这样的事情就可以了:

AbstractQTGLWidget.hpp

...
class AbstractQTGLWidget ... {
  ...
protected:
  QSize sizeHint() const { return QSize(400,300); }
  ...
};

当使用width()height()属性时,我认为(但不是100%肯定)问题出在构造函数中。

不同的布局,建立每个小部件的宽度和高度的不同优先级,因此构造函数到最终的宽度和高度。

给出初始宽度和高度,我假设底层的osg查看器可以计算相机和对象引用,并相应地开始该过程。后来正确应用宽度和高度的变化,因为对象是以正确的大小启动的,但不是最终的。

也许控件认为它的大小为0 x 0像素,并且渲染器会疯狂初始化......

0: with 0

1: With 1

答案 1 :(得分:1)

我尝试使用您提供的代码重现问题。但是,我无法获得最新的OpenSceneGraph(及其OpenThreads依赖)构建。

因此,我使您的示例更简单,并使用QFrame而不是OSG小部件。

我已经对代码进行了很多实验,我的建议是尝试添加一个调用:

 viewer->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);