QOpenGLWidget QT请求上下文

时间:2015-12-10 16:12:12

标签: c++ qt

我一直在使用带有QOpenGLWindow的着色器文件并使用版本330着色器,一切正常。 但是想切换一个Widget,以便能够将它停靠在我的主应用程序窗口中。从那以后,我一直在尝试获得正确的背景。

我可以使用QGLWidget创建正确的(我已经看到它已被弃用):

 QGLFormat format;
 format.setProfile(QGLFormat::CoreProfile);
 format.setVersion(3,3);                                                                                                                                                                               
 QGLFormat::setDefaultFormat(format);

当我使用QOpenGLWidget执行完全相同的操作时: 我得到了

QOpenGLShader::compile(Vertex): ERROR: 0:1: '' :  version '330' is not supported

对于某些人来说,这是合理的,因为QGLFormat的管理不对新类负责。

但是在切换到新类并使用以下命令设置核心配置文件后

  QSurfaceFormat format;
  format.setProfile(QSurfaceFormat::CoreProfile);
  format.setVersion(3,3);
  QSurfaceFormat::setDefaultFormat(format);

我很喜欢:

0   libobjc.A.dylib                 0x00007fff89f9a0dd objc_msgSend + 29
1   libqcocoa.dylib                 0x000000011085e3a3 QCocoaIntegration::createPlatformOpenGLContext(QOpenGLContext*) const + 83
2   org.qt-project.QtGui            0x000000010d2c954a QOpenGLContext::create() + 74
3   org.qt-project.QtWidgets        0x000000010cc35a6d QOpenGLWidgetPrivate::initialize() + 141
4   org.qt-project.QtWidgets        0x000000010cc36e58 QOpenGLWidget::event(QEvent*) + 232
5   org.qt-project.QtWidgets        0x000000010cbd632b QApplicationPrivate::notify_helper(QObject*, QEvent*) + 251
6   org.qt-project.QtWidgets        0x000000010cbd9648 QApplication::notify(QObject*, QEvent*) + 8136
7   org.qt-project.QtCore           0x000000010da59d83 QCoreApplication::notifyInternal(QObject*, QEvent*) + 115
8   org.qt-project.QtWidgets        0x000000010cc18879 sendWindowChangeToTextureChildrenRecursively(QWidget*) + 73
9   org.qt-project.QtWidgets        0x000000010cc03339 QWidget::setParent(QWidget*, QFlags<Qt::WindowType>) + 2217
10  org.qt-project.QtWidgets        0x000000010cbf4569 QLayout::addChildWidget(QWidget*) + 201
11  org.qt-project.QtWidgets        0x000000010cd1e740 QMainWindowLayout::setCentralWidget(QWidget*) + 32
12  ultrahaptics.Optimus_gui        0x000000010cb27f74 MainWindow::MainWindow() + 580
13  ultrahaptics.Optimus_gui        0x000000010cb2396b main + 59

我在macbook pro上使用Os X.如果有人知道解决方法/原因评论是受欢迎的。

2 个答案:

答案 0 :(得分:1)

我已经在某处读过如果你在OS X上开发你的OpenGL程序(无论你使用什么平台:Qt Creator,XCode ......),你将只能使用一个版本的OpenGL 2.1或4.1,默认版本通常为2.1 因此,通过使用setDefaultFormat,我们强制系统为我们初始化OpenGL 4.1。

我上传了一个如何在Mac上使用OpenGL 4.X的示例。

QOpenGLWidget_OpenGL4.1

享受

答案 1 :(得分:0)

您应该将代码移动到main.cpp文件中:

 QGLFormat format;
 format.setProfile(QGLFormat::CoreProfile);
 format.setVersion(3,3);                                                                                                                                                                               
 QGLFormat::setDefaultFormat(format);

你的main.cpp看起来应该是:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

        QSurfaceFormat format;
//        format.setDepthBufferSize(24);
    //    format.setStencilBufferSize(8);

        format.setMajorVersion( 3 );
        format.setMinorVersion( 3 );
        format.setProfile(QSurfaceFormat::CoreProfile);
        QSurfaceFormat::setDefaultFormat(format);

    Dialog w;
    w.show();

    return a.exec();
}

您可能需要将QSurfaceFormat头文件添加到main.cpp!

我希望这会有所帮助。

欢呼声, 奈