2013-08-05 3 views
0

У меня есть письмо, которое содержит идеально отформатированный html с единственным исключением, что изображения связаны по-другому: <img width=456 height=384 id="_x0000_i1026" src="cid:[email protected]" alt="cid:[email protected]"> email имеет другие части, включая изображение с этим идентификатором содержимого. Проблема в том, что я не знаю, как указать QWebview на данные (которые у меня есть). Есть ли способ добавить изображение в его кеш?Как отображать изображения с электронной почты с помощью 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); 
} 

-Подключите его к WebView с:

MyManager* manager = new MyManager; 
view->page()->setNetworkAccessManager(manager); 

3- Обеспечить реализацию MyNetworkReply, которая наследует от QNetworkReply, a QIODevice -класс. И это сложная часть. Вы должны обеспечить, по крайней мере readData(), bytesAvailable(), конструктором, который устанавливает ответ в терминах HTTP заголовков, и запускает фактическое асинхронное чтение с QTimer::singleShot()

-Расшифруйте крепление (вероятно, из base64, если это картинка) в a 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 никогда не считывает все данные и отображает значок сломанного изображения.

+0

Как обойти всех, кто может попробовать это: кеш НЕ используется, если вы явно не назовете его самим. Значит, вам все равно придется реализовать QNetworkAccessManager, а не только новый объект кеша. Хотя для меня флаг «Небуферизованный» не вызывает ошибку, этот ответ сказал, что это так. Тем не менее, большая благодарность за помощь. – chacham15

+0

Хотя я заметил, что у меня не было полной загрузки изображений, когда я опустил раздел 'setHeader (QNetworkRequest :: ContentTypeHeader, QVariant (« image/png »)). – chacham15

Смежные вопросы