使用Qt中的“evaluateJavaScript”读取javascript函数的返回值

时间:2014-04-11 16:50:04

标签: javascript c++ qt google-maps qtwebkit

This is my route planner widget implemented with Qt5 and WebKit

如何在C ++中获取java脚本函数返回值?

经过很长一段时间使用JavaScript后,我使用google maps API V3实现了一个路由规划器。我定义了一些函数来通过Qt的WebKit函数访问它的脚本部分: evaluateJavaScript()。现在困难的部分是,获取标记的位置数据(见图片,标记是红色的)。在JavaScript端,我只返回一个数组。如何阅读Qt结尾的" latlng" -array?

插图 - 这就是我想简化的内容:

// JavaScript
function getJSFoo() {
  return foofoo;
}
// C++
void readInQt() {
  // something like this:
  float val = evaluateJavaScript("getJSFoo()");
  // Do stuff
}

提前致谢!

这是我的代码,或多或少我如何使用它。 在java脚本的结尾:

// Add a marker to the map and push to the array.
function addMarker(location) {
  var marker = new google.maps.Marker({
      position: location,
      map: map,
      draggable:true
  });

  var LatLng = marker.getPosition();
  var sLatLng = "Latitude:    " + marker.getPosition().lat().toString() + 
                "\nLongitude: " + marker.getPosition().lng().toString();
  marker.setTitle(sLatLng);

  flightMarker.push(marker);
  return flightMarker;
}

function getMarkers() {
  var latlng = []
  for (var i = 0; i < flightMarker.length; i++) {
    latlng.push(flightMarker[i].getPosition() );
  }
  return latlng;
}

在Qt结尾:

void sl_submitRoute() {
    getWaypoints();
}

QList<float> getWaypoints() {
    QList<float> lWaypoints;
    // I don't know what I do here :D
    QVariant varMarkers = mView->page()->mainFrame()->evaluateJavaScript(QString("getMarkers();") );
    QList <QVariant> allListObj = varMarkers.toList();
    qDebug() << allListObj;

    return lWaypoints;
}

1 个答案:

答案 0 :(得分:2)

我找到了解决方案。最简单的方法是将数据转换为QStringList并返回。 否则,数据类型转换可能会导致泄漏。

的JavaScript

function getMarkers() {
  var latlng = []
  for (var i = 0; i < flightMarker.length; i++) {
    var sPos = flightMarker[i].getPosition().lat().toString() + ":" + flightMarker[i].getPosition().lng().toString();
    latlng.push(sPos);
  }
  return latlng;
}

Qt的

// Returns a list of points: Latitude & Longitude
RouteF getWaypoints() {
    RouteF lWaypoints;

    QVariant varMarkers = mView->page()->mainFrame()->evaluateJavaScript(QString("getMarkers();") );
    QList<QVariant> allListObj = varMarkers.toList();
    for(int i = 0; i < allListObj.size(); i++) {
        QStringList lPoint = allListObj.at(i).toString().split(':');
        if(lPoint.size() != 2) {
            qDebug() << "Warning: Waypoint not valid!";
            continue;
        }

        double fLat = lPoint.at(0).toDouble();
        double fLon = lPoint.at(1).toDouble();
        PointF waypoint = PointF(fLat, fLon);
        lWaypoints.push_back(waypoint);
        qDebug() << "Added point: " << fLat << ":" << fLon;
    }

    return lWaypoints;
}