我有一封电子邮件,其中包含格式正确的html,但有一个例外,即图片的链接方式不同:<img width=456 height=384 id="_x0000_i1026" src="cid:X.MA2.1374935634@aol.com" alt="cid:X.MA4.1372453963@aol.com">
电子邮件包含其他部分,包括带有此内容ID的图片。问题是我不知道如何将QWebview指向数据(我有)。有没有办法将图像添加到缓存中?
答案 0 :(得分:1)
这可能但不容易。 基本上你需要:
1-提供您自己的QNetworkAccessManager
- 继承的类,覆盖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()
从中读取。
在{4.6}天的Qt Labs开发人员编写的qt.gitorious.org
中有一个完整的例子。它们显示内部生成的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永远不会读取整个数据并显示损坏的图片图标。