Qt 5.9 - 由于不推荐调用 glLoadIdentity 导致 0x0 异常

Posted

技术标签:

【中文标题】Qt 5.9 - 由于不推荐调用 glLoadIdentity 导致 0x0 异常【英文标题】:Qt 5.9 - Exception at 0x0 due to deprecated call of glLoadIdentity 【发布时间】:2017-08-12 22:10:48 【问题描述】:

我有一个同学写的以下代码(我们正在做一个项目):

//inside cqtopencvviewergl.cpp
void CQtOpenCVViewerGl::resizeGL(int width, int height)

    makeCurrent();

    glViewport(0, 0, (GLint)(width), (GLint)(height));

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(0, width, -height, 0, 0, 1);

    glMatrixMode(GL_MODELVIEW);

    recalculatePosition();

    emit imageSizeChanged(mRenderWidth, mRenderHeight);

    updateScene();

根据调试器,glLoadIdentity() 的调用导致Exception at 0x0, code: 0x0000005 在我的情况下为C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe

我知道该功能已被弃用。但我对所有关于我应该怎么做的信息来源感到非常困惑。所以我会帮助你克服迷失方向,希望你能帮助我......

根据this 的回答,出现异常是因为使用的函数已被弃用。但问题有所不同,因为我(或我们)包含的 openGL 完全不同:

cqtopencvviewergl.cpp 的顶部,我们包含以下内容:

#include "include/Gui/cqtopencvviewergl.h"
#include <QOpenGLFunctions>
#include <opencv2/opencv.hpp>
#include <QPalette>

cqtopencvviewergl.h 的顶部,我们包括:

#include <QOpenGLWidget>
#include <QOpenGLFunctions_2_0>
#include <opencv2/core/core.hpp>

所以我们使用 Qt 类来调用 openGL 函数。我查看了代码,似乎 Qt 自己处理了弃用。

同样根据this的回答Qt支持所有当前的桌面OpenGL版本

根据this 提问者对问题How to replace following (deprecated) OpenGL functions? 的回答,Windows 离线安装程序默认是基于角度的。我使用离线安装程序...

根据 qt wiki 中的this 条目要使用 ANGLE 编译 Qt必须安装 Direct X SDK。但是,如果我使用QOpenGLFunctionsQOpenGLFunctions_2_0,我怀疑我是否真的需要这个...

根据 wiki 条目,Direct X SDKWindows SDK 的一部分,所以我也怀疑我已经拥有 ANGLE,因为我已经拥有一些 Windows SDK:

另外根据this 的文章我应该使用configure -opengl dynamicly 并且因为我使用Windows 我试图找出在哪里调用configure 并在this 文章中找到configure.bat -opengl desktop。所以想运行configure.bat -opengl dynamic,但我在C:\Qt\Qt5.9.1 目录中的任何地方都找不到configure.bat...

我使用以下 Qt 工具包:

我是唯一一个(项目中的 6 人)有这个问题的人。通常我的问题更准确,但我在这里迷路了。我该怎么办?

【问题讨论】:

不应该是QOpenGLFunctions_2_0::glLoadIdentity()吗?看起来你是在直接调用 opengl 函数。 @JornVernee 不,电话会转到QOpenGLFunctions_2_0::glLoadIdentity()... 停止使用兼容 OpenGL 的 ANGLE。如果你想要旧的东西,你必须使用 real OpenGL 实现,而不是 ANGLE 的东西。 【参考方案1】:

嗯,解决方法很简单……

根据this的文章加载机制可以通过QT_OPENGL环境变量和以下应用属性进行配置...

所以我添加了QT_OPENGL 设置为desktop 作为系统环境变量:

控制面板 > 系统 > 高级系统设置 > 环境变量

我确定我的电脑讨厌我……干杯!

【讨论】:

以上是关于Qt 5.9 - 由于不推荐调用 glLoadIdentity 导致 0x0 异常的主要内容,如果未能解决你的问题,请参考以下文章

Qt 5.9对Mac的图形显示有许多改进

Qt 5.9 安装过程报错现象及解决方案

如何在ROS中链接Qt 5.9?

Node.js 发布 v8.0.0 正式版;Qt 5.9 正式发布,长期支持版本 | 软件周刊

Node.js v8.0.0 正式发布;Nginx 1.13.1 发布;Qt 5.9 正式发布

anaconda安装出现conda.execute(700): An error occurred while installing package ‘defaults::qt-5.9解决办法.7-