qt4 — QtWebView — C ++ — Как получить строку JavaScript, возвращенную из события linkClicked

Я не смог найти окончательного ответа на мою проблему.

В настоящее время у меня есть элемент управления QWebView, загружающий html-файл, который находится на моем жестком диске, который реализует векторную карту с действиями javascript. Html-файл загружает jvectormap US States Map. Действие click для любого состояния запускает действие onRegionClick, связанное с функцией showCities, аргументы события и кода которой обрабатываются методом onRegionClick, реализованным в файле jquery-jvectormap.js. 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>

И информация заголовочного файла mainwindow.h в Qt:

#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, QMessageBox в функции on_WebView_linkClicked фактически вызывает / запускает событие, которое показывает QMessageBox.

Цель здесь — получить строку javascript, возвращаемую в html-файле в функции showCities, для отображения в событии on_webView_linkClicked. По всей видимости, действие linkClicked не распознает возвращение javascript как ссылку, поэтому при использовании векторной карты jquery оно остается тихим.

Я искал это везде, и единственный ответ, который я могу получить, заключается в том, что, если к этим областям в векторной карте были прикреплены URL-ссылки, это может сработать, но мое встраивание фиктивных ссылок в эти регионы не вызывает событие on_webView_linkClicked.

Спасибо за твою помощь 🙂

0

Решение

Вы можете добавить 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...
}

в HTML JS

function showCities(event, code) {
qtMainWindow.showCities(code);
}
2

Другие решения

ИМХО, следующее решение проще:

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();
0

По вопросам рекламы [email protected]