最近, 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, 不想打补丁的人伤不起啊,就不打了。