Как отображать изображения из электронной почты с QWebView?

У меня есть электронное письмо, содержащее отлично отформатированный HTML-файл, за исключением того, что изображения связаны по-разному: <img width=456 height=384 id="_x0000_i1026" src="cid:X.MA2.1374935634@aol.com" alt="cid:X.MA4.1372453963@aol.com"> электронная почта имеет другие части, включая изображение с этим идентификатором контента. Проблема в том, что я не знаю, как указать QWebview на данные (которые у меня есть). Есть ли способ добавить изображение в свой кеш?

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- Подключите его к веб-просмотру с помощью:

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 никогда не читает все данные и отображает значок разбитого изображения.

Другие вопросы по тегам