QWebView 获取内容类型
Posted
技术标签:
【中文标题】QWebView 获取内容类型【英文标题】:QWebView get content type 【发布时间】:2011-01-05 06:05:41 【问题描述】:当我点击 QWebView 中的链接时,我需要根据该链接的 MIME 类型执行一些操作。
显然,当我单击链接时 QWebView 会尝试导航到那里,但是在此之后我如何获取内容类型?
【问题讨论】:
【参考方案1】:我相信您可以在页面加载后通过查看 QWebElment 的集合来获取加载页面的内容类型。首先,您需要为 webview 小部件设置 loadFinished 事件槽。像这样:
QWebView::connect(ui->webView, SIGNAL(loadFinished(bool)), this, SLOT(on_pageLoad_finished(bool)));
on_pageLoad_finished 方法应该在每次页面加载到 webview 控件时执行。在那里,您可以通过 webframe 对象访问 Web 元素集合。下面是 on_pageLoad_finished 插槽的可能实现
void MainWindow::on_pageLoad_finished(bool ok)
if (!ok) return;
QWebFrame* frame = ui->webView->page()->currentFrame();
if (frame!=NULL)
QWebElementCollection collection = frame->findAllElements("meta[http-equiv=content-type]");
foreach (QWebElement element, collection)
qDebug() << element.attribute("http-equiv");
qDebug() << element.attribute("content");
它应该为加载到应用程序输出中的每个新页面转储内容类型。
update0 图片链接:
如果用户单击图像或者您只是这样加载它,则下划线 DOM 模型中没有具有 content-type 属性的元元素:
QUrl url("http://www.motociclismo.es/rcs/noticias/2008/10_Oct/0610-bmw-s1000RR-02.jpg");
ui->webView->load(url);
但仍有一些 dom 对象被创建。对于这个特定的图像,它应该如下图所示(您可以通过 frame->tohtml 获得)。
<html>
<body style="margin: 0px;">
<img style="-webkit-user-select: none; cursor: -webkit-zoom-in; " src="http://www.motociclismo.es/rcs/noticias/2008/10_Oct/0610-bmw-s1000RR-02.jpg" >
</body>
</html>
所以如果您使用以下代码查询 IMG 对象:
QWebElementCollection collection0 = frame->findAllElements("img");
foreach (QWebElement element, collection0)
QStringList attributesList = element.attributeNames();
foreach (QString attributeName, attributesList)
qDebug() << attributeName << ":" << element.attribute(attributeName);
你应该得到以下结果:
"style" : "-webkit-user-select: none; cursor: -webkit-zoom-in; "
"src" : "http://www.motociclismo.es/rcs/noticias/2008/10_Oct/0610-bmw-s1000RR-02.jpg"
"width" : "426"
"height" : "320"
src 属性为您提供所显示图像的链接。我猜你可以在检测类型时信任它的扩展;或者只是下载图像并使用文件签名检测它的类型。您可以为此编写代码或使用一些 3rd 方成像库来获取文件类型。
希望这会有所帮助,问候
【讨论】:
这仅适用于 HTML 页面吗?如果我点击其他类型的链接,比如 mp3,会怎样?在这种情况下如何获取 MIME 类型?以上是关于QWebView 获取内容类型的主要内容,如果未能解决你的问题,请参考以下文章