2017-12-18 274 views
0

根据http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html一章“调用QML方法”,我尝试从C++调用main.qml中的bbox函数。未能调用QML函数

这里是我的代码:

main.qml

import QtQuick 2.0 
import QtQuick.Window 2.0 
import QtLocation 5.6 
import QtPositioning 5.6 

Window { 
    width: 512 
    height: 512 
    visible: true 

    Item{ 
     anchors.fill: parent 

     Plugin{ 
      id: osmplugin 
      name: "osm" 
     } 

     Map { 
      anchors.fill: parent 
      id: map 
      plugin: osmplugin; 
      zoomLevel: (maximumZoomLevel - minimumZoomLevel)/2 
      center { 
       // The Qt Company in Oslo 
       latitude: 59.9485 
       longitude: 10.7686 
      } 
     } 
     Component.onCompleted:{ 
      console.log("zoomlevel : " + map.zoomLevel) 
      console.log("Visible region : " + map.visibleRegion) 
     } 

     function bbox(){ 
      return map.visibleRegion; 
     } 
    } 

} 

和main.cpp中

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QQuickItem> 
#include <QGeoRectangle> 
#include <QQmlComponent> 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    QQmlApplicationEngine engine; 
    QQmlComponent component(&engine, "qrc:/main.qml"); 

    QObject *map = component.create(); 
    QVariant ret; 

    bool ok = QMetaObject::invokeMethod(map, "bbox", Qt::DirectConnection, Q_RETURN_ARG(QVariant, ret)); 

    if (!ok){ 
     qWarning("Fail to call qml method"); 
    } 
    QGeoRectangle rect = qvariant_cast<QGeoRectangle>(ret); 

    return app.exec(); 
} 

我收到以下错误信息:

“QMetaObject :: invokeMethod中:没有这样的方法QQuickWindow :: bbox()“

似乎没有找到bbox功能。你能帮我找到问题吗?

在此先感谢。

+0

那么BBOX()不是你的地图的方法(C++)。只需将其从项目移到窗口即可。 –

+0

正确,谢谢,它工作。所以,如果我必须让这个函数在Item中(例如)什么是正确的代码来访问Item的那个(子)函数? – kontiki

回答

0

给你的项目对象名称:

Item{ 
    anchors.fill: parent 
    objectName: "bboxObj" 

    function bbox(){ 
     return map.visibleRegion; 
    } 
} 

在C使用对象名称++让你的对象:

QObject *map = component.create(); 
QObject *bboxObj= map->findChild<QObject*>("bboxObj"); 

,并调用方法:

if (bboxObj) 
    ok = QMetaObject::invokeMethod(bboxObj, "bbox", Qt::DirectConnection, Q_RETURN_ARG(QVariant, ret)); 
+0

非常感谢你们两位。对我来说更是一步。 – kontiki