2016-06-22 12 views
1

Qt noobはこちら。私はPoS gps座標を持つjsonを読み込んでマップに表示するQt5を備えたデスクトップアプリケーションを開発しようとしています。 これを簡単に実行できるように見える唯一のネイティブAPIはQtLocationでした。これは明らかにQMLだけです。 QMLの発見、私はまだQMLにマップを追加することはできましたが、私のコードでマップを統合することができました。 QMLは本当に得意です。私はいろいろな方法を試しましたが、実際に進歩を遂げていないので、私はこの問題のアプローチに疑問を抱いています。ここでQMLのQtコードからPoIを追加する方法QtLocationマップ

は、私がこれまで持っているものです。

main.cppに:

#include "analyserq.h" 
#include <QtWidgets/QApplication> 
#include <QQuickView> 
#include <QQuickItem> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    analyserQ w; 

    w.show(); 
    return a.exec(); 
} 

analyserq.h:

#ifndef ANALYSERQ_H 

#define ANALYSERQ_H 

#include <QtWidgets/QWidget> 
#include <QtWidgets> 
#include "ui_analyserq.h" 
#include <QQuickView> 
#include <QQuickItem> 
#include <qqmlengine.h> 

class analyserQ : public QWidget 
{ 
    Q_OBJECT 

public: 
    analyserQ(QWidget *parent = 0); 
    ~analyserQ(); 

private: 
    Ui::analyserQClass ui; 
    QPushButton *button; 
private slots: 

}; 

#endif // ANALYSERQ_H 

analyserq.cpp:

#include "analyserq.h" 

analyserQ::analyserQ(QWidget *parent) 
    : QWidget(parent) 
{ 
    ui.setupUi(this); 
    QQuickView *view = new QQuickView(); 
    QWidget *map = new QWidget(); 
    QWidget *container = QWidget::createWindowContainer(view, map); 
    container->setMinimumSize(200, 200); 
    container->setMaximumSize(200, 200); 
    container->setFocusPolicy(Qt::TabFocus ); 
    view->setSource(QUrl("map.qml")); 
    button = new QPushButton(tr("&Load..."), this); 

    /*QQuickView *view2 = new QQuickView(); latest attempt. failed. 
    QWidget *poi = new QWidget(); 
    QWidget *container2 = QWidget::createWindowContainer(view2, poi); 
    view2->setSource(QUrl("poi.qml")); 
    container2->setParent(map);*/ 

    QGridLayout *mainLayout = new QGridLayout; 
    mainLayout->addWidget(button, 0, 0); 
    mainLayout->addWidget(map, 3, 0); 
    setLayout(mainLayout); 

} 

analyserQ::~analyserQ() 
{ 

} 

ポイ.qml:

MapCircle { 
      center { 
       latitude: 59.9485 
       longitude: 10.7686 
      } 
      radius: 50000.0 
      color: 'blue' 
      border.width: 3 
     } 

map.qml:

import QtQuick 2.0 
import QtLocation 5.5 

Rectangle { 
    anchors.fill: parent 

    Plugin{ 
     id: osmplugin 
     name: "osm" 
    } 

    Map { 
     anchors.fill: parent 
     id: map 
     plugin: osmplugin; 
     zoomLevel: (maximumZoomLevel - minimumZoomLevel)/2//16 
     center { 
      // The Qt Company in Oslo 
      latitude: 59.9485 
      longitude: 10.7686 
     } 

     MapCircle { 
      center { 
       latitude: 59.9485 
       longitude: 10.7686 
      } 
      radius: 500.0 
      color: 'green' 
      border.width: 3 
     } 

    } 




} 

編集:私は今、QML機能を通してそれをやろうとしていますが、それは働いていません。 map要素にaddPoi関数を追加し、それをC++コードから呼び出そうとしました。これまでのところこれ以上の成功はありません。

analyserq.cppに追加
function addPoi(latitude, longitude, type) { 
      console.log("Got message:"); 
      circle = Qt.createQmlObject('import QtLocation 5.3; MapCircle { center{latitude: 59.9485; longitude: 10.7686} }', map, "dynamic"); 
      if(circle == null) { 
       console.log("error creating object" + circle.errorString()); 
      } 

      circle.radius = 5000.0; 
      circle.color = 'blue'; 
      circle.border.width = 3; 
      map.addMapItem(circle); 
      return "some return value"; 
     } 

QMetaObject::invokeMethod(map, "addPoi", 
     Q_RETURN_ARG(QVariant, returnedValue), 
     Q_ARG(QVariant, latitude), Q_ARG(QVariant, longitude), Q_ARG(QVariant, type)); 
    qDebug() << "QML function returned:" << returnedValue.toString(); 

答えて

0

さてさて、私は自分のコードから呼び出さQMLでのJS関数を介してそれを行うことができました。ここに関連する部分です:

analyserq.cpp

QObject *rootObj; 
analyserQ::analyserQ(QWidget *parent) 
    : QWidget(parent) 
{ 
    ui.setupUi(this); 
    QQuickView *view = new QQuickView(); 
    QWidget *map = new QWidget(); 
    QWidget *container = QWidget::createWindowContainer(view, map); 
    container->setMinimumSize(400, 450); 
    container->setMaximumSize(800, 800); 
    container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
    container->setFocusPolicy(Qt::TabFocus ); 
    view->setSource(QUrl("map.qml")); 

    button = new QPushButton(tr("&Load..."), this); 
    connect(button, &QAbstractButton::clicked, this, &analyserQ::loadPoI); 


    label = new QLabel(tr("Choix Trajets."), this); 

    liste = new QComboBox; 
    liste->setEditable(false); 
    liste->addItem("1"); 

    loadCombobox(); 

    QGridLayout *mainLayout = new QGridLayout; 
    mainLayout->addWidget(button, 0, 0); 
    mainLayout->addWidget(map, 1, 0); 

    mainLayout->addWidget(label, 5, 0); 

    mainLayout->addWidget(liste, 5,1); 


    setLayout(mainLayout); 
    rootObj = view->rootObject(); 

[...]

void analyserQ::addPoI(QVariant latitude, QVariant longitude, QVariant type) 
{ 
    QVariant returnedValue; 

    QMetaObject::invokeMethod(this->rootObj, "addPoi", 
     Q_RETURN_ARG(QVariant, returnedValue), 
     Q_ARG(QVariant, latitude), Q_ARG(QVariant, longitude), Q_ARG(QVariant, type)); 
    qDebug() << "QML function returned:" << returnedValue.toString(); 
} 

map.qml

import QtQuick 2.0 
import QtLocation 5.5 
import QtPositioning 5.2 



Rectangle { 
    anchors.fill: parent 

    Plugin{ 
     id: osmplugin 
     name: "osm" 
    } 
    function addPoi(lat,longi,type) { 
      //console.log("Got message:", lat); 
      //console.log("Got message:", longi); 
      //console.log("Got message:"); 
      //var lat = lat; 
      var circle = Qt.createQmlObject('import QtLocation 5.3; MapCircle { }', map, "dynamic"); 
      if(circle == null) { 
       console.log("error creating object" + circle.errorString()); 
       return false; 
      } 
      circle.center = QtPositioning.coordinate(lat, longi); 
      circle.radius = 500.0; 

      if(type == 0){ 
       circle.color = 'blue'; 
      } 
      else if(type == 1){ 
       circle.color = 'yellow'; 
      } 
      else if(type == 2){ 
       circle.color = 'red'; 
      } 
      else if(type == 3){ 
       circle.color = 'green'; 
      } 
      circle.border.width = 1; 
      map.addMapItem(circle); 
      map.center = QtPositioning.coordinate(lat, longi); 
      console.log("success creating object"); 
      return true; 
     } 

次のステップ:ランドマークがクリック可能にすることを... 。

関連する問題