这是可能的,但并不容易。
基本上你需要:
1- 提供您自己的QNetworkAccessManager-inherited 类,覆盖createRequest() 以捕获引用"cid" 的这些链接:
QNetworkReply*
MyManager::createRequest (Operation op,
const QNetworkRequest & req,
QIODevice * outgoingData = 0)
{
if (op==GetOperation && req.url().scheme() == "cid")
return MyNetworkReply(req.url().path());
else
return QNetworkAccessManager::createRequest(op, req, outgoingData);
}
2- 将其连接到 webview:
MyManager* manager = new MyManager;
view->page()->setNetworkAccessManager(manager);
3- 提供MyNetworkReply 的实现,它继承自QNetworkReply,一个QIODevice 类。这是复杂的部分。您至少需要提供readData()、bytesAvailable() 一个构造函数,它根据HTTP 标头设置回复,并使用QTimer::singleShot() 启动实际的异步读取
4- 将附件(如果是图片,可能从base64)解码为QByteArray,以便您的MyNetworkReply::readData() 从中读取。
qt.gitorious.org 上有一个完整的示例,由 Qt Labs 开发人员在 Qt 4.6 天编写。它们显示内部生成的 PNG,而不是外部邮件附件,但一般步骤如上所述。见:
http://qt.gitorious.org/qt-labs/graphics-dojo/blobs/master/url-rendering/main.cpp
但是,此代码在 Qt-4.8 中存在缺陷。在RendererReply 的构造函数中,当它这样做时:
open(ReadOnly|Unbuffered);
这应该是:
open(ReadOnly);
否则 webkit 永远不会读取整个数据并显示损坏的图片图标。