2010-04-28 73 views
6

好的,我在一个文件logo.png的同一目录下有一个Qt可执行文件。如何让QWebKit显示图像?

我调用以下:

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

webView->setHtml(msg); 

其中webviewQWebKit指针

然而,当我执行程序,图像不显示。我从图像所在的目录执行程序... 为什么它不显示?这让我疯狂!

+0

我仍然无法得到这个工作。我尝试了绝对路径,QUrl等。 – 2010-05-02 06:16:25

回答

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())

不能在这里和现在测试它,但你可以尝试给的baseUrlfile://abcd

此外,缺乏PNG支持可能是一个问题,因此您应该检查您的Qt版本中是否启用了PNG支持。

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

+0

尝试访问HTTP PNG文件 - 没有问题。 – 2010-05-02 02:55:21

+0

看看Qt WebKit的安全策略。我认为他们现在有一些关于这方面的文件。 – BastiBen 2010-05-03 16:04:55

+0

+1:使用'baseUrl'参数工作,但只有当我使用绝对路径似乎。令人烦恼的是,将'QUARl :: fromLocalFile(“。”)'作为'baseUrl'传递不起作用(尽管'QUrl.valid()'为'QUrl'返回'true')。 – Troubadour 2010-05-06 21:33:08

10

该标志。如果没有给出适当的baseUrl,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(); 
} 
+0

当我有机会时,我会尝试。 – 2010-05-08 05:53:43

+0

Grrr,'Qdir :: current()',为什么我没想到呢? :) – Troubadour 2010-05-08 09:40:00

1

我遇到了同样的问题,终于搞定了。

务必在给正确的路径QUrl,得到图像正确读取

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

在Qt上进行调试时,您当前的目录是build目录!不在调试/释放目录..

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