所以我在整合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。我已经确认正在调用帧功能。
答案 0 :(得分:3)
我找到了一个解决方案:您必须为查看器控件添加大小提示。这样的事情就可以了:
在AbstractQTGLWidget.hpp
:
...
class AbstractQTGLWidget ... {
...
protected:
QSize sizeHint() const { return QSize(400,300); }
...
};
当使用width()
和height()
属性时,我认为(但不是100%肯定)问题出在构造函数中。
不同的布局,建立每个小部件的宽度和高度的不同优先级,因此构造函数盲到最终的宽度和高度。
给出初始宽度和高度,我假设底层的osg查看器可以计算相机和对象引用,并相应地开始该过程。后来正确应用宽度和高度的变化,因为对象是以正确的大小启动的,但不是最终的。
也许控件认为它的大小为0 x 0像素,并且渲染器会疯狂初始化......
0:
1:
答案 1 :(得分:1)
我尝试使用您提供的代码重现问题。但是,我无法获得最新的OpenSceneGraph(及其OpenThreads依赖)构建。
因此,我使您的示例更简单,并使用QFrame而不是OSG小部件。
我已经对代码进行了很多实验,我的建议是尝试添加一个调用:
viewer->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);