首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QML PoI映射上从C++ Qt代码中添加QtLocation

如何在QML PoI映射上从C++ Qt代码中添加QtLocation
EN

Stack Overflow用户
提问于 2016-06-22 19:16:19
回答 1查看 1.1K关注 0票数 1

Qt努布来了。我正在尝试用Qt5开发一个桌面应用程序,它读取带有PoI gps坐标的json,并将它们显示在地图上。唯一看起来能够轻松地做到这一点的本地API是QtLocation,它显然仅限于QML。在发现QML之后,我仍然设法在代码中集成了一个映射,如果直接添加到QML中,甚至还集成了一个PoI,但是我似乎无法从我的C++代码中动态地在映射上创建它们,而且我还没有真正得到QML。我尝试过各种方法,但并没有真正取得任何进展,所以我怀疑我对这个问题的态度。

以下是我到目前为止所拥有的:

main.cpp:

代码语言:javascript
复制
#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();
}

分析:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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()
{

}

poi.qml:

代码语言:javascript
复制
MapCircle {
            center {
                latitude: 59.9485
                longitude: 10.7686
            }
            radius: 50000.0
            color: 'blue'
            border.width: 3
        }

map.qml:

代码语言:javascript
复制
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++代码中调用它。到目前为止没有再成功了。

代码语言:javascript
复制
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";
        }

在analyserq.cpp中添加:

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-24 07:30:03

好的,我通过从我的代码中调用的QML中的JS函数成功地做到了这一点。以下是相关部分:

analyserq.cpp

代码语言:javascript
复制
    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();

..。

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
        }

下一步:让PoIs点击..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37976512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档