[日记]2013年11月13日 一种解决问题的思路

在将Qt4应用移植到Qt5时遇到OpenGL显示黑屏的问题。经过排查,从Qt5的OpenGL封装变化、初始化代码以及UI界面三个方面进行猜想,最终发现是UI文件需要修改以适应Qt5导致的。通过调整UI文件,成功解决了黑屏问题。
摘要由CSDN通过智能技术生成

在Qt4移植到Qt5的过程中,程序的OpenGL图形显示窗口出现了黑屏的现象。虽然每个bug都有其特殊性,不过解决问题的思路和方法总是有相似之处,记录下来和大家分享。

这是第一次运行之后出现的情况,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文件里有的怎么编辑界面里就没有了呢?!

总结

问题总是可以解决的,只要沿着正确的思路进行思考,就像热播日剧《半泽直树》里的男主,用正确到无可挑剔的动机和行为解决了看似不可能的任务!当然足够的前置知识也是必须的,不然只会是抓瞎。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值