如何获得从linkClicked事件返回的javascript字符串

QtWebView -- C++ -- How to get javascript string returned from linkClicked event

本文关键字:javascript 字符串 返回 事件 何获得 linkClicked      更新时间:2023-10-16

我一直找不到一个明确的答案。

我目前有一个QWebView控件加载在我的硬盘上的html文件,它实现了一个带有javascript动作的矢量地图。html文件加载一个jvectormap美国州地图。任何状态上的单击操作都会触发与showCities函数绑定的onRegionClick操作,该函数的事件和代码参数由jquery-jvectormap.js文件中实现的onRegionClick方法处理。html文件如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="styles/style2.css" type="text/css"/>

    <link rel="stylesheet" media="all" href="styles/jquery-jvectormap.css"/>
    <script src="js/jquery.tools.min.js"></script>
    <script src="js/jquery-jvectormap.js"></script>
    <script src="js/jquery-jvectormap-us-en.js"></script>
    <script>
        $(function() {
            $('.map').vectorMap({
                map: 'us_en',
                color: 'green',
                hoverColor: 'blue',
                onRegionClick: showCities
            });
        });
        function showCities(event, code) {
            return code;
        }

    </script>
</head>

<body>

    <div id="front">

        <div class="map"></div>
        </div>

</body>
</html>

和Qt中的mainwindow.h头文件信息:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QUrl>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_webView_linkClicked(const QUrl &arg1);

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

然后是MainWindow.cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QtGui>
#include <QtCore>
#include <QDebug>
#include <QtWebKit>
#include <QWebSettings>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
   ui->webView->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
   connect(ui->webView,SIGNAL(linkClicked(QUrl)),this,SLOT(on_webView_linkClicked(QUrl)));
}
MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_webView_linkClicked(const QUrl &arg1)
{
    QMessageBox::information(this,"Title","Test");
}

on_webView_linkClicked函数没有被触发/触发时,我点击任何特定的区域区域。任何单击的区域都被设计为返回一个字符串。当我在网页(如http://www.google.com)上尝试时,on_WebView_linkClicked函数中的QMessageBox实际上会触发/触发一个显示QMessageBox的事件。

这里的目标是在函数showCities中获得html文件中返回的javascript字符串,以显示在on_webView_linkClicked事件中。显然,linkClicked操作不能将javascript返回值识别为链接,因此在使用jquery矢量映射时它保持沉默。

我已经到处搜索了这个,唯一的答案我可以得到的是,如果在vectormap的这些区域有url链接附加到他们,它可能会起作用,但我在这些区域嵌入假链接不会导致on_webView_linkClicked事件触发。

谢谢你的帮助

你可以注入一个QObject(例如你的MainWindow)到JavaScript中。一旦JavaScript函数被调用,你就可以将调用转移到被注入的对象。

不是一个完整的代码,但给一个想法:

MainWindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT
    ...
public slots:
    void jsInjection();
    void showCities(const QString &code);
}

MainWindow.cpp

MainWindow::MainWindow()
{
    ...
    connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
            this, SLOT(jsInjection()));
}
void MainWindow::jsInjection()
{
    ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("qtMainWindow", this);
}
void MainWindow::showCities(const QString &code)
{
    // Do smth with code...
}
function showCities(event, code) {
    qtMainWindow.showCities(code);
}

恕我直言,下面的解决方案更简单:

mainwindow.h

protected slots:
    void showCities();

mainwindow.cpp

//in constructor
//make sure that page already loaded
webView->page()->mainFrame()->addToJavaScriptWindowObject("qt", this);

// implement function
void MainWindow::showCities()
{
    // do what you want to do
}

abc.js

qt.showCities();