2

如何使QML WebView 元素使用Qt::openUrlExternally而不是一些可视的newWindowComponent

4

2 回答 2

3

我认为使用 QML 没有简单的方法可以做到这一点。您可以使用标准来执行此操作QWebView,但无法从 QML 中访问此功能。您需要重新包装QWebView并公开更多功能。

使用标准 C++ 接口的示例:

测试.cpp

#include <QtGui>
#include <QtWebKit>
#include "handler.hpp"

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QWebView view;
    view.load(QUrl::fromUserInput("http://qt-project.org/"));

    view.page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);

    LinkHandler handler;

    QObject::connect(
        &view, SIGNAL(linkClicked(const QUrl&)),
        &handler, SLOT(open(const QUrl&)));

    view.show();

    return app.exec();
}

处理程序.hpp

#ifndef _HANDLER_HPP_
#define _HANDLER_HPP_

#include <QtGui>

class LinkHandler : public QObject
{
    Q_OBJECT
    public:
        LinkHandler();

    public slots:
        void open(const QUrl& url);
};

#endif

处理程序.cpp

#include "handler.hpp"

LinkHandler::LinkHandler() : QObject() {}

void LinkHandler::open(const QUrl& url)
{
    QDesktopServices::openUrl(url);
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

find_package(Qt4 4.8 REQUIRED QtCore QtGui QtWebkit)
include(${QT_USE_FILE})

qt4_wrap_cpp(MOC_FILES handler.hpp)
add_executable(test
    test.cpp
    handler.hpp
    handler.cpp
    ${MOC_FILES})
target_link_libraries(test ${QT_LIBRARIES})
于 2012-04-30T19:37:23.300 回答
0

以下代码将在新窗口中打开所有链接,但添加检测是微不足道的target=_blank

WebView{
    id: webView
    url: "samples/sample.html"
    preferredWidth: parent.width
    enabled: false
    onLoadFinished: {
        evaluateJavaScript(' \
            var els = document.getElementsByTagName("a"); \
            for (var i in els){ \
                els[i].onclick = function(e){e.preventDefault(); qml.qmlCall(this.getAttribute("href")); return false;} \
            } \
        ')
        enabled = true;
        }
    javaScriptWindowObjects: QtObject {
        WebView.windowObjectName: "qml"

        function qmlCall(url) {
            console.log(url);
            Qt.openUrlExternally(url)
        }
    }
}

它归结为在加载后在 webview 中添加一些 javascript 以覆盖链接的默认操作并将href属性的值传递给 qml,并从那里从外部打开。

于 2013-04-02T11:24:50.320 回答