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

Qt+;OpenGL&x2B;图形视图框架,代码很少,但在访问0x00000000时崩溃,qt,opengl,qgraphicsscene,Qt,Opengl,Qgraphicsscene,我使用OpenGL创建了一个新的Qt应用程序,只需添加如下场景: { ui->setupUi(this); QGraphicsView *pSceneView = new QGraphicsView(this); setCentralWidget(pSceneView); QGLWidget *pGLWidget = new QGLWidget; pSceneView->setViewport(pGLWidget); pSceneView->setV

我使用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::MainScene(QObject *parent /* = 0 */)
:QGraphicsScene(parent)
{
  setSceneRect(-1024/2, -768/2, 1024, 768);
}

void MainScene::drawBackground(QPainter *painter, const QRectF &rect)
{
    painter->drawRect(sceneRect());
}
类mainsecene是从QGraphicscene继承的,只需按如下方式设置ScenInstruction和rewrite-Trackground:

{
  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::MainScene(QObject *parent /* = 0 */)
:QGraphicsScene(parent)
{
  setSceneRect(-1024/2, -768/2, 1024, 768);
}

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

如果我不重写trackground或不调用glBindBuffer,它就不会崩溃。Qt版本是5.3.2,操作系统是windows 7。

根据您所说的,很难找出问题所在。OpenGL功能可能取决于代码运行的系统。当某些东西没有实现时也会出现类似的崩溃,尽管您通常可以看到Qt无法与QtCreator应用程序输出控制台窗口中的某些函数绑定

我很少遇到类似的问题,它们通常与OpenGL/videoadapter功能相关。有一种方法可以修复大多数问题,不过可以通过使用-opengl es2标志构建Qt,该标志在硬件无法提供所需级别的opengl时使用角度技术来模拟opengl

而且,从Qt5.4开始,我们可能只需切换到Qt5.4就可以解决所有这些问题。 他们承诺修复许多此类错误,并在需要时对OpenGL进行适当的动态模拟

我想这会让你更容易尝试新的Qt(除非你已经这么做了)