0

私の問題に対する決定的な答えを見つけることができませんでした。

現在、QWebView コントロールに、ハード ドライブにある HTML ファイルをロードしてもらい、javascript アクションでベクター マップを実装しています。html ファイルは jvectormap US States Map をロードします。任意の状態のクリック アクションは、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のような Web ページでこれを試すと、 on_WebView_linkClicked 関数の QMessageBox が実際に QMessageBox を表示するイベントをトリガー/起動します。

ここでの目標は、関数 showCities の html ファイルで返された JavaScript 文字列を取得して、on_webView_linkClicked イベントに表示することです。明らかに、linkClicked アクションは JavaScript の戻り値をリンクとして認識していないため、jquery ベクター マップを使用するとサイレントのままになります。

私はこれをどこでも検索しましたが、私が得ることができる唯一の答えは、vectormap 内のそれらの領域に URL リンクが添付されている場合は機能する可能性があるということですが、それらの領域にダミーのリンクを埋め込んでも on_webView_linkClicked イベントが発生しません。

ご協力ありがとうございます:)

4

2 に答える 2

2

QObject(メインウィンドウなど)を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...
}

HTMLJSで

function showCities(event, code) {
    qtMainWindow.showCities(code);
}
于 2013-01-02T22:06:19.700 に答える
0

私見、次の解決策はより簡単です:

メインウィンドウ.h

protected slots:
    void showCities();

メインウィンドウ.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();
于 2014-02-24T09:29:14.330 に答える