0

画像のリンクが異なるという 1 つの例外を除いて、完全にフォーマットされた 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ます。そして、これは複雑な部分です。HTTP ヘッダーに関して応答をセットアップし、実際の非同期読み取りを開始するコンストラクターをreadData()少なくとも提供する必要があります。bytesAvailable()QTimer::singleShot()

4-添付ファイル(おそらくbase64画像の場合)をデコードして、そこから読み取れるようにQByteArray します。MyNetworkReply::readData()

Qt 4.6 日の間にQt Labsqt.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 がデータ全体を読み取ることができず、壊れた画像のアイコンが表示されます。

于 2013-08-05T21:06:11.127 に答える