添加到布局时QGLWidget崩溃

时间:2014-04-29 16:04:30

标签: 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创建者制作的表格。

我尝试的第一件事: 网格布局是我在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); 

Segfaults以同样的方式。

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

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

不知道该怎么做。也许QGLWidget想要在我调用ui-&gt; setupUi(this)之前做点什么?也许它不能出于某种原因将小部件添加到布局中?

当然,如果我注释掉我添加小部件的行,该程序可以正常运行。

关于这里发生了什么的任何想法?

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

3 个答案:

答案 0 :(得分:0)

我不确定,但我认为问题出在以下几行:

ui->gridLayout->addWidget(GLWidget);

我认为,你应该写如下:

ui->gridLayout->addWidget(glwidget);

答案 1 :(得分:0)

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

所以解决方法是致电:

ui->setupUi(this)

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

答案 2 :(得分:0)

// declare glwidget as member of your class 

GLWidget *glwidget;  


//in constructor use 

glwidget = new GLWidget();