QWebView获取内容类型

时间:2010-01-14 20:18:07

标签: qt content-type mime qwebview

当我点击QWebView中的链接时,我需要根据该链接的MIME类型执行一些操作。

显然当我点击链接时,QWebView会尝试在那里导航,但是如何在此之后获取内容类型?

1 个答案:

答案 0 :(得分:3)

我相信您可以在加载页面后查看QWebElment的集合来获取已加载页面的内容类型。首先,您需要为webview小部件设置loadFinished事件槽。像这样:

QWebView::connect(ui->webView, SIGNAL(loadFinished(bool)), this, SLOT(on_pageLoad_finished(bool)));
每次将页面加载到webview控件中时,都应执行

on_pageLoad_finished方法。您可以通过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模型中没有带元素类型属性的元素:

QUrl url("http://www.motociclismo.es/rcs/noticias/2008/10_Oct/0610-bmw-s1000RR-02.jpg");
ui->webView->load(url);

但仍然创建了一些dom对象。对于这个特定的图像,它应该看起来像下面的那个(你可以通过frame-&gt; 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" width="426" height="320">
</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属性为您显示所显示图像的链接。我想你可以在检测到类型时信任它的扩展;或者只是下载图像并使用文件签名检测它的类型。您可以为此编写代码或使用某些第三方映像库来获取文件类型。

希望这有帮助,尊重