在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文件里有的怎么编辑界面里就没有了呢?!
总结
问题总是可以解决的,只要沿着正确的思路进行思考,就像热播日剧《半泽直树》里的男主,用正确到无可挑剔的动机和行为解决了看似不可能的任务!当然足够的前置知识也是必须的,不然只会是抓瞎。