【问题标题】:How to display images from an email with QWebView?如何使用 QWebView 显示电子邮件中的图像?
【发布时间】:2013-08-05 18:45:45
【问题描述】:

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

【问题讨论】:

    标签: html qt qwebview


    【解决方案1】:

    这是可能的,但并不容易。 基本上你需要:

    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 永远不会读取整个数据并显示损坏的图片图标。

    【讨论】:

    • 作为其他可能尝试此操作的人的旁注:除非您自己明确调用缓存,否则不会使用缓存。这意味着,您仍然必须实现 QNetworkAccessManager 而不仅仅是一个新的缓存对象。虽然,对我来说,Unbuffered 标志不会导致错误,但这个答案说确实如此。不过,非常感谢您的帮助。
    • 虽然,我注意到当我省略 setHeader(QNetworkRequest::ContentTypeHeader,QVariant("image/png")); 部分时,图像没有完全加载。
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2011-10-17
    • 2011-09-06
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多