7

好的,我在与文件相同的目录中有一个 Qt 可执行文件logo.png

我称之为:

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

webView->setHtml(msg);

指针webview在哪里QWebKit

但是,当我执行程序时,图像不显示。我正在从图像所在的目录执行程序...为什么不显示?这让我发疯!

4

4 回答 4

10

如果未给出适当的 baseUrl,则可能无法正确解析 logo.png。

这是一个例子。请注意,应用程序必须从包含 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();
}
于 2010-05-08T05:49:44.867 回答
1

问题是 WebKit 中的安全限制。

AFAIK 背后的想法是防止来自 Internet 的 HTML 页面包含/引用硬盘上的文件,并且由于某种原因,调用也setHtml()使 WebKit 认为不允许 HTML 访问磁盘上的文件(使用file://模式)。

我想我通过让 WebKit 知道设置的 HTML 确实来自硬盘本身并且应该被允许分别访问本地文件来解决这个问题。

void QWebView::setHtml ( const QString & html, const QUrl & baseUrl = QUrl() )

不能在这里和现在测试它,但你可以尝试给baseUrl类似file://abcd.

此外,缺少 PNG 支持可能是个问题,因此您应该检查您的 Qt 构建中是否启用了 PNG 支持。

尝试引用网络上的 PNG 图像(例如http://files.iconfactory.net/news/CandyBar.png),看看它是否出现。如果是这样,则支持 PNG,问题是 WebKit 中的安全限制。

于 2010-04-28T12:29:32.543 回答
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 编写代码,这就是我所得到的。项目文件名为Images.rar。它与 MS Visual C++ 相结合。我使用 Qt 4.6.2 从该存档中成功构建了代码。

您也可以查看标准 Qt 示例文件夹中的预览器应用程序。在我的主机上,路径是:

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

希望对您有所帮助!

于 2010-04-28T06:30:45.137 回答
1

我遇到了同样的问题,终于解决了。

请务必在QUrl中提供正确的路径,以正确读取图像

例如:C:/xxx/abc.png 上的图像文件 -> QUrl必须类似于C:/xxx/yyy -> yyy必须与图像位于同一目录中。

在 Qt 上调试时,您当前的目录是构建目录!不在调试/发布目录..

在 exe 上,您可以通过调用QDir::current()获得真正的当前目录。

于 2011-05-28T17:42:59.620 回答