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();