QGLWidget 添加到布局时崩溃

Posted

技术标签:

【中文标题】QGLWidget 添加到布局时崩溃【英文标题】:QGLWidget crashes when added to layout 【发布时间】:2014-04-29 16:04:30 【问题描述】:

我正在尝试调整此处介绍的 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->setupUi(this) 之前做点什么?也许由于某种原因它无法将小部件添加到布局中?

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

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

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

【问题讨论】:

请注意,QGLWidget 已被弃用,从 Qt 5 开始,建议改用 QOpenGLWidget,尤其是对于 opengl-es。 这个问题已经很老了,但这个问题与 opengl-es 无关——我正在将示例“改编”成标准的 opengl。 【参考方案1】:

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

所以解决方法是调用:

ui->setupUi(this)

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

【讨论】:

【参考方案2】:

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

ui->gridLayout->addWidget(GLWidget);

我想,你应该这样写:

ui->gridLayout->addWidget(glwidget);

【讨论】:

那是一个错字。修复它并编辑问题。两个版本的程序都会出现段错误。【参考方案3】:
// declare glwidget as member of your class 

GLWidget *glwidget;  


//in constructor use 

glwidget = new GLWidget();  

【讨论】:

以上是关于QGLWidget 添加到布局时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

将 ScrollView 添加到我的 XML 布局文件后应用程序崩溃

将占位符文本添加到文本字段时,iOS 7 中的应用程序崩溃

单击 SaveTask 按钮后,未添加到 Main Activity 中的任务显示。并且应用程序正在崩溃。请检查布局管理器是不是正确设置

Xcode 8 添加布局边距崩溃

编辑 XIB 时 XCode 7.3 崩溃

旋转设备时崩溃布局