[日记]2013年11月13日 一种解决问题的思路
2013-11-13 14:25
302 查看
在Qt4移植到Qt5的过程中,程序的OpenGL图形显示窗口出现了黑屏的现象。虽然每个bug都有其特殊性,不过解决问题的思路和方法总是有相似之处,记录下来和大家分享。
这是第一次运行之后出现的情况,OpenGL图形显示窗口一片黑色,而其他组件均可以点击,并且功能正常。由此作出第一个猜想。
这时我随意拖动窗口,惊奇地发现其实黑色部分只是OpenGL绘图区域的一部分,而且大小是固定的!原来之前只是因为显示区域太小而误以为是整个绘图区域全黑了。而且除了黑色区域之外的区域的显示功能和交互功能全部正常,这是一个突破性的发现,由此重新思考bug的原因。
偷偷吐槽:为什么这个显然bug在Qt4里显示正常?!还有Qt Creator只允许在Qt Designer里修改ui界面可是那个出错的Widget明明ui文件里有的怎么编辑界面里就没有了呢?!
这是第一次运行之后出现的情况,OpenGL图形显示窗口一片黑色,而其他组件均可以点击,并且功能正常。由此作出第一个猜想。
猜想一:Qt5的OpenGL封装和Qt4不同导致的
在百度上查找资料后发现确实有这种情况,这篇文章中所描述的问题就和我的一样,也许就是这个问题,要自己编译Qt5了T_T,不过我跑了一下Qt自带的OpenGL demo发现运行得起来(回想到自己当时下载的是最大的安装包,已经把opengl编译进去了),那可能是代码写法上有区别了吧。。。于是比较4和5里demo的代码有没有区别,特别是.pro文件的内容(之前被坑好多次了),确实有些许区别,于是依样修改了,运行,还是老样子。。。哭。。。这时我随意拖动窗口,惊奇地发现其实黑色部分只是OpenGL绘图区域的一部分,而且大小是固定的!原来之前只是因为显示区域太小而误以为是整个绘图区域全黑了。而且除了黑色区域之外的区域的显示功能和交互功能全部正常,这是一个突破性的发现,由此重新思考bug的原因。
猜想二:OpenGL画面的初始化部分代码有问题
继续看代码,其中有几个函数如QSize Graph4DMap::sizeHint() const { qDebug()<<"Graph4DMap::sizeHint()"<<QSize(600,400); return QSize(600,400); }
QRectF Graph4DMap::boundingRect() const { qreal adjust = 2; qDebug()<<"Graph4DMap::boundingRect()"<<QRectF(-300-adjust/2,-200-adjust/2,600+adjust,400+adjust); return QRectF(-300-adjust/2,-200-adjust/2,600+adjust,400+adjust); }和OpenGL窗口大小有关,并且数值是写死的,修改这些参数值重新运行,发现黑色区域大小没有任何变化。。。跪。。。
猜想三:ui界面部分代码有问题
把程序的OpenGL绘制部分单独剥离出来运行,正常显示!那么可能是把OpenGL画面放进ui界面时出了问题。我用QQ截图= =算出黑色区域的大小(约700*500),和ui文件进行比较,发现有一个不知名的Widget的大小与此类似<widget class="QWidget" name="layoutWidget"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>741</width> <height>511</height> </rect> </property> </widget>于是在构造函数里把这个Widget给隐藏了,再次运行,正常了!
解决方案:修改ui文件
通过调用hide()函数可以让程序看起来正常了,但这个问题本质上是由于ui界面搭得有缺陷导致的,所以根本的解决方法是把这个隐藏得很深的Widget给去掉,至此,大功告成!偷偷吐槽:为什么这个显然bug在Qt4里显示正常?!还有Qt Creator只允许在Qt Designer里修改ui界面可是那个出错的Widget明明ui文件里有的怎么编辑界面里就没有了呢?!
总结
问题总是可以解决的,只要沿着正确的思路进行思考,就像热播日剧《半泽直树》里的男主,用正确到无可挑剔的动机和行为解决了看似不可能的任务!当然足够的前置知识也是必须的,不然只会是抓瞎。相关文章推荐
- 解决ArcGIS中因SDE或数据库配置问题而导致服务宕掉的一种思路
- 换一种思路:解决Ajax程序与IE7不兼容的问题
- 换一种思路:解决Ajax程序与IE7不兼容的问题
- 换一种思路解决问题
- 用Python递归解决阿拉伯数字转为中文财务数字格式的问题(2)--打开思路的一种方法
- 换一种思路:解决Ajax程序与IE7不兼容的问题
- 换一种思路解决问题
- 换一种思路解决问题
- 百度echart图表宽度自适应问题的一种解决思路
- 解决IE兼容问题的一种思路-HTML判断IE版本
- 从求职网站求职说起。再谈换一种思路解决问题,先做人,后做程序(开放求职工具源码)。
- 关于如何解决特定场景下WPF4.0中“XamlWriter.Save序列化限制”问题的一种思路
- Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路
- [导入]从求职网站求职说起。再谈换一种思路解决问题,先做人,后做程序(开放求职工具源码)。
- 002-创建的Eclipse项目中红叹号问题解决思路
- tomcat内存溢出问题解决思路
- 学习解决问题的思路
- C++与Java使用SOCKET通信遇到的一种阻塞问题的解决
- Eclipse下导出java程序可执行的jar包图片无法显示问题的一种解决方法
- Android 中ViewPager+fragment报异常:IllegalStateException:Can't change tag of fragment的一种解决思路