无法使用外部QOpenGLWidget创建的上下文

Cant use context made by external QOpenGLWidget?

本文关键字:创建 上下文 QOpenGLWidget 外部      更新时间:2023-10-16

调试时的确切崩溃是:

下级已停止,因为它触发了异常。线程0中的停止者:0x7fed96c6cda处的异常,代码:0x0000005:0x0处的读取访问冲突,标志=0x0。

然后异常指向下面代码中的这一行:

if(QOpenGLContext::currentContext()->isValid())

下面的代码足以为我重现这个异常。对QOpenGLWidget类进行子类化并在尝试访问上下文之前进行一次子类调用initializeGL()并不能解决问题。

#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLContext>
#include <QDebug>
void initialize(QOpenGLWidget * renderArea)
{
renderArea->makeCurrent();
if(QOpenGLContext::currentContext()->isValid())
{
qInfo() << "Valid.";
}
}
int main(int argc, char *argv[])
{
QSurfaceFormat format;
format.setVersion(3,3);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
QApplication a(argc, argv);
QOpenGLWidget * glw = new QOpenGLWidget;
initialize(glw);
return a.exec();
}

我现在意识到了答案:你必须在事件循环开始后进行所有这样的opengl初始化。

一个固定的代码,其中"MainWindow"类在接收信号"onEventLoopStarted"时进行所有opengl初始化:

#include "mainwindow.h"
#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLContext>
#include <QDebug>
#include <QTimer>
int main(int argc, char *argv[])
{
QSurfaceFormat format;
format.setVersion(3,3);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
QApplication a(argc, argv);
MainWindow w;
w.resize(512, 512);
w.show();
QTimer::singleShot(0, &w, SLOT(onEventLoopStarted()));
return a.exec();
//Window receives event and begins to initialize.
}

QOpenGLWidget在首次显示小部件时初始化GL资源
因此,您可以在调用initialize()之前添加glw->show()