2017-12-18 275 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