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