2017-12-18 5 views
0

http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html "Invoking QML Methods"장에 따르면 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

당신의 품목 오브젝트의 이름을 지정 :

C에서
Item{ 
    anchors.fill: parent 
    objectName: "bboxObj" 

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

개체 이름 사용하여 객체를 얻을 ++ :

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

관련 문제