Как заставить QWebKit отображать изображение? - PullRequest
7 голосов
/ 28 апреля 2010

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

Я звоню по следующему номеру:

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

webView->setHtml(msg);

, где webview - указатель QWebKit

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

Ответы [ 4 ]

10 голосов
/ 08 мая 2010

Логотип.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();
}
1 голос
/ 28 мая 2011

У меня возникла та же проблема, и я наконец-то решил ее.

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

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

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

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

1 голос
/ 28 апреля 2010

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

1 голос
/ 28 апреля 2010
  1. Проверьте, если Qt build поддерживает 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 из моего огромного проекта, и вот то, что я получил Файл проекта называется Images.rar. Это в сочетании с MS Visual C ++. Я успешно строю код из этого архива с помощью Qt 4.6.2.

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

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

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

...