Как заставить QWebKit отображать изображение?
Хорошо, у меня есть исполняемый файл Qt в том же каталоге, что и файл logo.png
,
Я называю следующее:
QString msg("<html><body><img src='logo.png' /></body></html>");
webView->setHtml(msg);
где webview
этоQWebKit
указатель
Однако, когда я запускаю программу, изображение не отображается. Я выполняю программу из каталога, в котором находится изображение... почему оно не отображается? Это сводит меня с ума!
4 ответа
Logo.png может быть не разрешен должным образом, если не указан соответствующий baseUrl.
Вот пример. Обратите внимание, что приложение должно быть запущено из каталога, содержащего logo.png, но dummy.html не должен существовать. Он просто используется для обеспечения правильного baseUrl.
#include <QtCore>
#include <QtGui>
#include <QtWebKit>
int main(int argc, char * argv[])
{
QApplication app(argc, argv);
QUrl baseUrl = QUrl::fromLocalFile(QDir::current().absoluteFilePath("dummy.html"));
QString msg("<html><body><img src='logo.png' /></body></html>");
QWebView *webView = new QWebView;
webView->setHtml(msg, baseUrl);
webView->show();
return app.exec();
}
Проблема заключается в ограничениях безопасности в WebKit.
AFAIK идея заключается в том, чтобы запретить HTML-страницам из Интернета включать / ссылаться на файлы на жестком диске, и по какой-то причине тоже вызов setHtml()
заставляет WebKit думать, что HTML нельзя разрешать доступ к файлам на диске (используя file://
схемы).
Я думаю, что я обошел это, дав WebKit знать, что установленный HTML действительно исходит от самого жесткого диска и ему должен быть разрешен доступ к локальным файлам соответственно.
void QWebView::setHtml ( const QString & html, const QUrl & baseUrl = QUrl() )
Не могу проверить это здесь и сейчас, но вы можете попробовать дать baseUrl что-то вроде file://abcd
,
Кроме того, отсутствие поддержки PNG может быть проблемой, поэтому вы должны проверить, включена ли поддержка PNG в вашей сборке Qt.
Попробуйте сослаться на изображение PNG в Интернете (например, http://files.iconfactory.net/news/CandyBar.png
), и посмотреть, если это появляется. Если это так, PNG поддерживается, и проблема заключается в ограничениях безопасности в WebKit.
У меня возникла та же проблема, и наконец я решил ее.
Обязательно укажите правильный путь в QUrl, чтобы изображение читалось правильно
Например: файл изображения на C:/xxx/abc.png -> QUrl должен быть примерно таким же, как C:/xxx/yyy -> yyy должен находиться в одном каталоге с изображением.
Во время отладки на Qt ваш текущий каталог является каталогом сборки! не на отладке / выпуске реж..
На exe вы получаете реальный текущий каталог, вызывая QDir:: current ().
- Проверьте, если Qt build с поддержкой png. Также вы можете попробовать другой формат изображения.
- Попробуйте использовать абсолютный путь. Для меня этот вариант работает:
Образец кода:
if (isPictureDirExists)
text.replace(QString("src=\""), QString("src=\"%1/img/")
.arg(conf.absImgFolder), Qt::CaseInsensitive);
QString html = QString("<html><head><meta Content=\"Text/html; " \
"CHARSET=Windows-1251\"></head><body>%1</body>" \
"</html>").arg(text);
webView->setHtml(html);
Удачи.
Добавлено: я пытался вычеркнуть код с помощью QWebkit из моего огромного проекта, и вот что я получил. Файл проекта называется Images.rar. Это в сочетании с MS Visual C++. Я успешно строю код из этого архива с помощью Qt 4.6.2.
Также вы можете посмотреть приложение предварительного просмотра из стандартной папки с примером Qt. На моем хосте путь:
C:\Qt\4.6.2\examples\webkit\previewer
Надеюсь, это поможет!