Qt + OpenGL +图形视图框架,代码很少,但访问0x00000000崩溃

时间:2014-12-02 17:56:13

标签: qt opengl qgraphicsscene

我使用OpenGL创建一个新的Qt应用程序,只需像这样添加场景:

{
  ui->setupUi(this); 

  QGraphicsView *pSceneView = new QGraphicsView(this);
  setCentralWidget(pSceneView);
  QGLWidget *pGLWidget = new QGLWidget;
  pSceneView->setViewport(pGLWidget);
  pSceneView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
  pSceneView->setScene(new MainScene);
  pGLWidget->makeCurrent();

  QGLFunctions *glFuncs = new QGLFunctions(pGLWidget->context());
  GLuint i;
  glFuncs->glGenBuffers(1, &i);
  glFuncs->glBindBuffer(GL_ARRAY_BUFFER, i); // unbind buffer cause crash
}

类MainScene继承自QGraphicsScene,只需设置SceneRect并重写drawBackground,如下所示:

MainScene::MainScene(QObject *parent /* = 0 */)
:QGraphicsScene(parent)
{
  setSceneRect(-1024/2, -768/2, 1024, 768);
}

void MainScene::drawBackground(QPainter *painter, const QRectF &rect)
{
    painter->drawRect(sceneRect());
}

如果我没有重写drawBackground或者没有调用glBindBuffer,它就不会崩溃.Qt版本是5.3.2,os是windows 7。

1 个答案:

答案 0 :(得分:0)

根据你所说的,找出错误有点困难。 OpenGL功能可能取决于运行代码的系统。虽然您通常可以看到Qt无法与Qt Creator Application Output控制台窗口中的某些功能绑定,但是在没有实现某些功能时会发生类似的崩溃。

我遇到的问题很少,而且它们通常与OpenGL / videoadapter相关。有一种方法可以解决大多数问题,不过通过使用-openg es2标志构建Qt,当硬件无法提供所需的OpenGL级别时,该标志使用ANGLE技术模拟OpenGL。

而且,从Qt 5.4开始,我们可以通过切换到它来解决所有问题。 http://qt-project.org/wiki/New-Features-in-Qt-5.4他们承诺修复许多此类类型的错误,并在需要时对OpenGL进行适当的动态模拟。

我想您可以更轻松地尝试新的Qt(除非您已经这样做过)。