QT 4.8.0 QURL的Bug??

来源:互联网 发布:朝阳永续数据库 编辑:程序博客网 时间:2024/06/05 03:17
 

 最近, Qt4.8.0终于正式release了,由于想用它带的QtWebkit 2.2.0,就下载了一个。

解包, 写编译脚本, 设置环境变量,在arm平台交叉编译成功生成了熟悉的几个Qt库以及plugins以后。

编以前的qtwebkit应用: 自己写的一个简单浏览器。

编译成功后, 发现跑起来以后,访问不了本地页面, 只能访问服务器页面,

我访问本地页面用的是如下语句: webView->load(QUrl("foo.html"));

这个foo.html跟可执行文件放在同目录下,以前在qt4.7.4版本下是可以正常访问的。

 

这肯定是版本升级带来的问题,怎么办? 查代码啊,有源码,咱不怕。

结果跟啊跟啊, 问题定位到QUrl里去了,

主要是这条语句:

QUrl baseUrl = QUrl::fromLocalFile(QFileInfo(url.toLocalFile()).absoluteFilePath());

baseUrl的值是/mnt/qtbrowser而不是/mnt/qtbrowser/foo.html, 把foo.html给丢了。

 

在看QUrl的方法toLocalFile()竟然返回了一个空字符串, 而不是foo.html,怪不得baseUrl没有foo.html了。

罪魁祸首还是在这个判断中:

if (d->scheme.compare(QLatin1String("file"), Qt::CaseInsensitive) != 0)

    return false;

由于d->scheme是空的,所以会返回false, 导致toLocalFile 返回空字符串。

对比了,4.7.4的代码, 发现4.7.4有个d->scheme.isEmpty()的判断, 如果是空的就不去比较,就不会返回false了。

 

分析到这里,情况就明朗了,原来, 还要对QUrl设置一个scheme啊, 调用QUrl的setScheme("file"),

问题解决了。

 

QUrl url("/mnt/qtbrowser/foo.html");url.setScheme(QLatin1String("file"));webView->load(url);//或者最省事:url.load(QUrl("file:///mnt/qtbrowser/foo.html");



 

 

唉, 说实话,当时我都有一种把d->scheme.isEmpty()判断加上的冲动, 省得我去加setScheme, 不想打补丁的人伤不起啊,就不打了。

 

 

原创粉丝点击