c++ - 添加到布局时 QGLWidget 崩溃

标签 c++ qt opengl opengl-es segmentation-fault

我正在尝试改编此处精选的 opengl Es 示例“Hello GL”- http://qt-project.org/doc/qt-4.8/opengl-hellogl-es.html .我基本上是在寻找一种简单的方法来将 3D 图形渲染窗口转换为 Qt Creator 中制作的窗体。

我尝试的第一件事: 网格布局是我在 Qt Creator 中创建的布局。

#include <QProcess>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QTimer>
#include "glwidget.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    GLWidget *glwidget = new GLWidget(); // This is mandatory. No problems here.
    QTimer *timer = new QTimer(this);    // Need this for the example to work.

    timer->setInterval(10); // Also necessary.

    ui->gridLayout->addWidget(glwidget);

它可以编译,但随后会因段错误而迅速崩溃。

    ui->gridLayout->addWidget(new GLWidget); 

以同样的方式出现段错误。

调试器将我指向 qgridlayout.h 的第 104 行:

   inline void addWidget(QWidget *w) { QLayout::addWidget(w); }

不知道该怎么做。也许 QGLWidget 想在我调用 ui->setupUi(this) 之前做一些事情?也许由于某种原因它无法将小部件添加到布局中?

当然,如果我注释掉添加小部件的行,程序将完美运行。

对这里发生的事情有什么想法吗?

编辑:我已经解决了这个问题。这是操作顺序的问题 - 我太快调用了 updateui。

最佳答案

生成的表单类中的 setupUi 函数初始化表单类的所有变量,因此在表单初始化之前使用变量是未定义的行为,因为变量包含垃圾。

所以解决方案是调用:

ui->setupUi(this)

在任何使用 ui 对象中的变量的调用之前。

关于c++ - 添加到布局时 QGLWidget 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23369778/

相关文章:

c++ - 在 Qt OSE 项目中使用 Win32 API

opengl - opengl 中的渲染目标是什么?

c++ - 从命令行编译 Visual C++

c++ - 声明已初始化的 C++ 静态变量(语法消歧)

c++ - 对象内的字符串数组

C++:继承问题

qt - QThread/QDialog 的竞争条件

qt - 在 QImage 中设置每个像素的 alpha channel

c++ - 如何使用 openGL 获得真正平滑的移动物体

c++ - OpenGL - 纹理四边形被裁剪​​并奇怪地拉伸(stretch)