2012-04-22 90 views

回答

3

我不認爲有一個簡單的方法來使用QML來做到這一點。您可以使用標準QWebView執行此操作,但是無法從QML中訪問此功能。您需要重新包裝QWebView並公開更多功能。

使用標準的C++接口的一個例子:

TEST.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(); 
} 

handler.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 

handler.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}) 
+0

正如我在回答QML的WebView元素解釋不提供QWebView的全接口我不能cathch信號=( – myWallJSON 2012-05-04 13:32:04

+0

,所以你不能使用標準的QML的WebView做你想做什麼。 – 2012-05-08 11:36:36

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,並從那裏打開。