3

所以我在集成 QT 和 OSG 时遇到了问题。我有一个运行良好的 QT/OSG 程序。布局与您在下面看到的类似。

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

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

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

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

4

2 回答 2

3

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

AbstractQTGLWidget.hpp

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

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

不同的布局,在确定每个小部件的宽度和高度时的优先级不同,因此构造函数对最终的宽度和高度视而不见。

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

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

0: 与 0

有 1: 有 1

于 2012-05-21T15:30:54.643 回答
1

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

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

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

 viewer->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
于 2012-05-13T15:33:27.227 回答