简单地说,我一辈子都不知道如何真正使用QOpenGLWidget
或QOpenGLWindow
之类的东西。我想让渲染成为MDI中窗口的子窗口小部件,但什么都不起作用。
以下是我目前为小部件设置的代码(至少,只有涉及OpenGL的部分):
Viewport::Viewport(QWidget * parent) : QOpenGLWidget(parent) { }
void Viewport::initializeGL() {
initializeOpenGLFunctions();
}
void Viewport::paintGL() {
// first, clear the screen
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
}
下面是我如何使用小部件:
vp = new Viewport;
vp->resize(QSize(320,240));
hbox->addWidget(vp);
结果我什么也看不见。我只看到窗口中另一个小部件旁边有一小块空地,但仅此而已。没有像我试图清除的那样的黑屏,甚至没有320x240大小的空地。
就像我说的,我一直无法用我能找到的任何方式做到这一点,这真的很令人沮丧。我是不是错过了一些显而易见的东西?文件很少,所以很难说我是不是,或者我是否遇到了一些奇怪的角落案例。(例如,我发现的文档中没有一个使用QOpenGLWidget
作为更大的小部件的一部分;这是因为它不能,还是因为我能找到的所有示例都懒得将小部件用作自己的顶级窗口?)
经过一番周旋,我的问题显然是由窗口中的另一个对象(QListView
)引起的,默认情况下会占用尽可能多的空间,这使得OpenGL小部件消失了,因为它没有最小的大小。
换句话说,通过将QListView
更改为具有QSizePolicy::Preferred
大小调整策略(因为调整窗口大小现在可以让您看到OpenGL小部件),或者为OpenGL小部件提供最小或固定的大小,可以解决此问题。
(顺便说一句,我真的希望这能比偶然发现更明显。)