如何使QML WebView 元素使用Qt::openUrlExternally而不是一些可视的newWindowComponent?
问问题
1618 次
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 回答