3D进阶之OSG: Qt程序退出时在QScopedPointer中崩溃

2024-03-15 22:18

本文主要是介绍3D进阶之OSG: Qt程序退出时在QScopedPointer中崩溃,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天调试一个osgQt的应用程序,在程序退出时发生崩溃。使用的是Qt5.15.0。

查了一下,原因在这里,

[QTBUG-93173] QGLContext::makeCurrent() crashes due to d->guiGlContext being null - Qt Bug Tracker

最新版本应该已经修复了这个问题。

原因:

在程序运行过程中,主程序会不断轮询所有的widget的,并传递消息。但在退出时,glcontext其实已经在析构,此时碰到没有nullptr检查,再次把widget设置为当前用例时,就会崩溃。

解决办法:

原作者是这么说的:

At the application level the following check can be made:

auto *_context = context()->contextHandle();
if (nullptr == _context || !_context->isValid())
{return ;
}

问题是:我们要怎么改?

接上一篇文章:3D进阶之OSG:编译osgQt的旧版本_高精度计算机视觉的博客-CSDN博客

老版本的osgQt源码在这里:https://github.com/mathieu/osgQt 

找到函数


bool GraphicsWindowQt::makeCurrentImplementation()
{if (_widget->getNumDeferredEvents() > 0)_widget->processDeferredEvents();_widget->makeCurrent();    return true;
}

修改后的源码如下,

bool GraphicsWindowQt::makeCurrentImplementation()
{if (_widget->getNumDeferredEvents() > 0)_widget->processDeferredEvents();/*https://bugreports.qt.io/browse/QTBUG-93173auto* _context = _widget->context()->contextHandle();if (nullptr == _context || !_context->isValid()){return;}*/QOpenGLContext* _context = _widget->context()->contextHandle();if (nullptr == _context || !_context->isValid()){return false;}_widget->makeCurrent();    return true;
}

最后,更新修改后的源码在这里,

GitHub - SpaceView/osgQtOld: Updated old version of osgQt from https://github.com/mathieu/osgQt

本文结束

这篇关于3D进阶之OSG: Qt程序退出时在QScopedPointer中崩溃的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813429

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati