0

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

4

1 回答 1

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()阅读的附件。

Qt Labs开发人员在 Qt 4.6 天qt.gitorious.org写了一个完整的示例。它们显示内部生成的 PNG,而不是外部邮件附件,但一般步骤如上所述。看:

http://qt.gitorious.org/qt-labs/graphics-dojo/blobs/master/url-rendering/main.cpp

但是,此代码在 Qt-4.8 中存在缺陷。在 for 的构造函数中RendererReply,当它执行时:

open(ReadOnly|Unbuffered);

这应该是:

open(ReadOnly);

否则 webkit 永远不会读取整个数据并显示损坏的图片图标。

于 2013-08-05T21:06:11.127 回答