2017-12-18 25 views
0

http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html「QMLメソッドの呼び出し」の章では、main.qml内のC++から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++で

Item{ anchors.fill: parent objectName: "bboxObj" function bbox(){ return map.visibleRegion; } } 

を:

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

をしてメソッドを呼び出しますあなたのマップのメソッドではありません(C++)。 ItemからWindowに移動するだけです。 –

+0

正解、ありがとう、それは動作します。だから、もしItemの中でこの関数を(例えば)Itemのその(サブ)関数へのアクセス権を持つ正しいコードにする必要があるのであれば? – kontiki

答えて

0

あなたの項目オブジェクト名与えます)

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

ありがとうございます。私のために一歩。 – kontiki

関連する問題