如何让 QWebKit 显示图像?

Posted

技术标签:

【中文标题】如何让 QWebKit 显示图像?【英文标题】:How to get QWebKit to display image? 【发布时间】:2010-04-28 05:45:41 【问题描述】:

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

我称之为:

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

webView->setHtml(msg);

其中webviewQWebKit 指针

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

【问题讨论】:

我仍然无法让它工作。我尝试了绝对路径、QUrl 等。 【参考方案1】:

如果没有给出适当的 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();

【讨论】:

有机会我会试试的。 Grrr,Qdir::current(),我怎么没想到呢? :)【参考方案2】:

问题在于 WebKit 中的安全限制。

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

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

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

现在不能测试它,但你可以尝试给 baseUrl 类似file://abcd 的东西。

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

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

【讨论】:

尝试访问 HTTP PNG 文件 - 没有问题。 看看 Qt WebKit 的安全策略。我想他们现在已经有一些关于这方面的文档了。 +1:使用baseUrl 参数有效,但前提是我似乎使用了绝对路径。烦人的是,将QUrl::fromLocalFile( "." ) 传递为baseUrl 不起作用(尽管QUrl.valid() 针对特定的QUrl 返回true)。【参考方案3】:
    检查 Qt 构建是否支持 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 从我的大型项目中编写代码,以及 here is 我所拥有的。项目文件名为Images.rar。它与 MS Visual C++ 相结合。我使用 Qt 4.6.2 从该存档中成功构建了代码。

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

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

希望对您有所帮助!

【讨论】:

【参考方案4】:

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

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

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

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

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

【讨论】:

以上是关于如何让 QWebKit 显示图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何让图像在 iOS 模拟器中显示?

如何让我的Buffered Image类在我的GUI中显示?

如何让自定义标签栏显示标签栏项目在 Xcode 中设置的选定图像?

使用 QWebEngineView 时如何防止创建奇怪的文件夹?

R语言绘图如何让多个图像显示于同一图中

怎么让电脑上的GIF图像在图标显示的时候就动起来