坑一:

最近做项目,需要在三个Qt的QWidget窗体上加载三维模型,但每次只显示某一个QWidget窗体的三维模型场景,其它的两个不显示。于是想到用QStackedWidget将这三个Qt的QWidget窗体通过addWidget加载,这样每次切换显示时利用QStackedWidget类的setCurrentIndex或setCurrentWidget就行,代码如下:

QMainWidget::QMainWidget(QWidget *parent): QStackedWidget(parent)
{ui.setupUi(this);m_pManholeCoverWnd = new CManholeCoverWnd(this);m_pJzWnd = new CJzWnd(this);m_pLaunchWnd = new CLaunchWnd(this);addWidget(m_pManholeCoverWnd);addWidget(m_pJzWnd);addWidget(m_pLaunchWnd);
}

其中 QMainWidget是QStackedWidget子类,m_pManholeCoverWnd、m_pJzWnd、m_pLaunchWnd 都是QWidget派生的子类且都通过addWidget函数放入到QMainWidget中了,且在它们的构造函数内部都创建了一个osgQt::GLWidget对象,如下:

void CManholeCoverWnd::initOsg()
{// 步骤一:初始化qt窗口系统osgQt::initQtWindowingSystem();// 步骤二:创建视口m_pViewer = new osgViewer::Viewer;// 步骤三:视口设为单线程(Qt5必须)m_pViewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);// 步骤四:对视图的操作,必须,否则无法显示黑屏m_pViewer->setCameraManipulator(new osgGA::TrackballManipulator);// 步骤五:视口操作// 步骤六:设置osgQt视口(一个应用程序用opgQt同一时刻只能设置一个视口)osgQt::setViewer(m_pViewer.get());// 步骤七:创建窗口(2个都要,只创建osgQt::GLWidget会挂掉)m_pGLWidget = new osgQt::GLWidget(this);m_pGraphicsWindowQt = new osgQt::GraphicsWindowQt(m_pGLWidget);// 步骤八:设置视口m_pViewport = new osg::Viewport(0, 0, m_pGLWidget->width(), m_pGLWidget->height());//m_pViewport = new osg::Viewport();// 步骤九:设置摄像机视口范围,未设置不会显示,即窗口一片黑(刷新窗口但没有内容显示)m_pViewer->getCamera()->setViewport(m_pViewport);m_pViewer->getCamera()->setClearColor(osg::Vec4f(0.0235, 0.45, 0.67, 1.0));// 步骤十:设置刷新显示内容,未设置不会显示,即一片白(不会刷新窗口)m_pViewer->getCamera()->setGraphicsContext(m_pGraphicsWindowQt);m_spRoot = new osg::Group();// 步骤十一:显示m_pGLWidget->show();
}

m_pGLWidget 就是 osgQt::GLWidget对象。CJzWnd、 CLaunchWnd类也有initOsg()函数,也在构造函数中调用了initOsg()函数,构造了一个 osgQt::GLWidget对象,但此时整个程序运行起来后,键盘、鼠标都不能用,程序假死。原因至今不知道。

坑二:

因为高度怀疑坑一的原因是同一个程序中不能同时加载多个osgQt::GLWidget对象,于是每次在坑一中的QMainWidget中接收到外部显示三维模型场景指令时,通过QStackedWidget的removeWidget函数将上次加载的显示三维场景的窗体部件移除,然后再通过insertWidget插入最新的显示三维模型场景的窗体部件,代码如下:

void QMainWidget::cmdSlot(const QString&qsMemo, EmOutMsgCmdType eCmd)
{QWidget *pWnd = widget(1); // 取得上次的显示三维场景的窗体部件removeWidget(pWnd);  // 移除上次的显示三维场景的窗体部件delete pWnd;pWnd = new CManholeCoverWnd();  insertWidget(1, pWnd);   // 插入最新的三维场景的窗体部件setCurrentWidget(pWnd);  // 显示插入最新的三维场景的窗体部件
}

这样处理坑一假死的现象确实没了,但有时在接收到指令切换显示时又会假死(和坑一不同,坑一是程序起来就假死,这是接收指令切换窗体有时会假死,程序起来时不假死)。

原因至今不知道。

坑三:

为了避免坑一、坑二的假死问题,将坑一中的m_pManholeCoverWnd、    m_pJzWnd、 m_pLaunchWnd 这三个窗体合并到一个QWidget类中,即将CManholeCoverWnd、    CJzWnd、 CLaunchWnd 这三个类合并为一个类A(这样代码很乱,但没办法),在A类的构造函数中调用上述initOsg()构造osgQt::GLWidget对象,这样只保证osgQt::GLWidget对象只有一个,假死问题解决。

但是在A类中构造的其它窗体或子窗体都无法显示,即使是设置这些窗体为置顶也无法显示,必须按win键(Ctl和Alt之间的那个键,有的电脑是Fn和Alt之间的键)才能显示,后来发现原因是:osgQt::GLWidget对象必须在A类中构造的其它窗体或子窗体显示出来后再显示,也就是说osgQt::GLWidget对象必须后显示才行,如果比A类中构造的其它窗体或子窗体先显示,则这些A类中构造的窗体都无法显示,原因至今不知道。

osgQt::GLWidget的坑相关推荐

  1. OpenSceneGraph源码分析:osgQt模块

    济南友泉软件有限公司 osgQt基于QGLWidget实现了在Qt窗口内OSG渲染操作.Qt以其开源.跨平台.方便快捷.现代化的界面风格等优点,已经成为了目前桌面版CAD/CAE/CAM等软件开发的首 ...

  2. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

    目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...

  3. java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  4. flask sqlalchemy踩坑记录

    查询 坑1: 查询不存在返回值不全是None 当使用first().one()等函数进行查询时,如果查询不存在,返回值为None 但是如果使用all().paginate()等函数进行查询是,如果返回 ...

  5. mac git使用与配置踩过的坑

    #mac git使用与配置踩过的坑 标题mac配置git ssh密钥 参考链接mac配置git ssh key go get安装失败的解决方法 go get约等于git clone+go instal ...

  6. 你需要掌握的有关.NET DateTime类型的知识点和坑位 都在这里

    引言    DateTime数据类型是一个复杂的问题,复杂到足以让你在编写[将日期从Web服务器返回到浏览器]简单代码时感到困惑. ASP.NET MVC 5和 Web API 2/ASP.NETCo ...

  7. (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...

  8. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得

    该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...

  9. Python 常见的坑汇总

    1. 列表与 * 操作 Python 中,* 操作符与 list 结合使用,实现元素复制. 复制 5 个空列表: In [1]: [[]] * 5 Out[1]: [[], [], [], [], [ ...

最新文章

  1. html 标签、图像、链接、注释、锚点定位、特殊字符
  2. 学霸现身!博士生发18篇SCI,4篇CNS子刊,开学典礼上全场震撼
  3. 央视首位AI手语主播亮相,动作精确、实时转译,网友:能接住广权的段子么?...
  4. Ruby:Hash 排序
  5. 设计模式的理解:命令模式 (Command)
  6. 功能强大的滚动播放插件JQ-Slide
  7. C语言 strcpy函数实现
  8. 辨异 —— 机器学习概念辨异、模型理解
  9. linux抓包工具:tcpdump 工具用法
  10. 获取请求真实IP地址的工具类
  11. 计算机网络教程第五版|微课版 - 第四章 网络层 - 重点概念【补充】
  12. unilx安装mysql_内容更新 · web-liuyang/uni-app-tools@72f7fd7 · GitHub
  13. 【0723】自动化运维——saltstack
  14. MultiTech MT9234ZBA 调制解调器Modem的测试方法
  15. apple pay 技术_如何在Apple Watch上设置和使用Apple Pay
  16. URLLC关键技术和网络适应性分析
  17. 高中毕业礼物送什么比较好?第一名的礼物你绝对想不到
  18. 浅析国有企业外部董事如何履职
  19. poj Hotel 线段树
  20. 推荐几款好用的Linux电子书阅读器(上)

热门文章

  1. 从大学生到职场人,一段深刻的思维认知升级补丁
  2. 做计算机的小卫士教案,小卫士在行动小班教案
  3. python raise语句_python中异常报错的分析处理
  4. linux下oracle导出12705,llinux下Oracle数据库的单个表导出导入
  5. centos7安装mysql6_2018年第四周-在centos7安装mysql6
  6. 在python中可以用什么关键字来声明一个类_3. Python基础语法
  7. sql server 修改表字段
  8. ASP.NET Core 依赖注入
  9. scala的多种集合的使用(6)之映射Map的操作方法
  10. selenium.common.exceptions.WebDriverException:no such session