2010-04-28 4 views
6

Хорошо, у меня есть исполняемый файл Qt в том же каталоге, что и файл logo.png.Как получить QWebKit для отображения изображения?

Я называю следующее:

QString msg("<html><body><img src='logo.png' /></body></html>"); 

webView->setHtml(msg); 

где webview Является ли QWebKit указатель

Однако, когда я выполнить программу, изображение не отображается. Я выполняю программу из каталога, в котором находится изображение ... Почему он не отображается? Это сводит меня с ума!

+0

Я до сих пор не могу заставить это работать. Я пробовал абсолютные пути, QUrl и т. Д. –

ответ

1
  1. Проверьте, если Qt с png поддержка. Также вы можете попробовать другой формат изображения.
  2. Попробуйте использовать абсолютный путь. Для меня такой вариант работы:

код примера:

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 от моего огромного проекта, и here is, что у меня есть. Файл проекта с именем Images.rar. Он сочетается с MS Visual C++. Я успешно создаю код из этого архива с Qt 4.6.2.

Также вы можете посмотреть приложение из стандартной папки примера Qt. На моем хосте путь:

C:\Qt\4.6.2\examples\webkit\previewer 

Надеюсь, что это поможет!

1

Проблема заключается в ограничениях безопасности в 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.

+0

Пробовал доступ к файлу PNG HTTP - никаких проблем с этим. –

+0

Ознакомьтесь с политиками безопасности Qt WebKit. Я думаю, что к этому времени у них есть документация. – BastiBen

+0

+1: Использование аргумента 'baseUrl' работает, но только если я использую абсолютный путь. Раздражающе, передавая 'QUrl :: fromLocalFile (". ")' Как 'baseUrl', не работает (несмотря на' QUrl.valid() 'return' true' для этого конкретного 'QUrl'). – Troubadour

10

Логотип.png не может быть правильно разрешено, если соответствующий baseUrl не указан.

Вот пример. Обратите внимание, что приложение должно запускаться из каталога, содержащего логотип.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(); 
} 
+0

Я попробую, когда у меня появится такая возможность. –

+0

Grrr, 'Qdir :: current()', почему я не подумал об этом? :) – Troubadour

1

У меня была такая же проблема, и, наконец, она работала.

Будьте уверены, чтобы дать правильный путь в QUrl, чтобы получить изображение сбоями

например: файл изображения на C: /xxx/abc.png -> QUrl должно быть что-то вроде C:/xxx/yyy -> yyy должен находиться в одном каталоге с изображением.

При отладке на Qt ваш текущий каталог директорий сборки! а не на отладочном/выпущенном каталоге.

На exe вы получаете реальный текущий каталог, вызывая QDir :: current().