如何使用QWebView显示电子邮件中的图像?

时间:2013-08-05 18:45:45

标签: html qt qwebview

我有一封电子邮件,其中包含格式正确的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指向数据(我有)。有没有办法将图像添加到缓存中?

1 个答案:

答案 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的实施,该实施继承自QNetworkReplyQIODevice - 类。这是一个复杂的部分。您需要提供至少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永远不会读取整个数据并显示损坏的图片图标。