【发布时间】:2016-06-22 19:16:19
【问题描述】:
Qt 菜鸟在这里。我正在尝试使用 Qt5 开发一个桌面应用程序,该应用程序读取带有 PoI gps 坐标的 json 并将它们显示在地图上。 唯一似乎能够轻松做到这一点的原生 API 是 QtLocation,它显然只是 QML。发现关于 QML,我仍然设法在我的代码中集成了一个地图,如果直接添加到 QML 甚至是一个 PoI,但我似乎无法从我的 C++ 代码在地图上动态创建它们,我不还没有真正获得 QML。我尝试了各种方法,但没有真正取得任何进展,所以我怀疑我对问题的处理方法。
这是我目前所拥有的:
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();
}
分析器q.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
分析器q.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()
{
}
poi.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 a 函数来完成它,但它不起作用。 我在我的地图元素中添加了一个函数 addPoi,并尝试从 C++ 代码中调用它。到目前为止还没有成功。
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 中添加:
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();
【问题讨论】:
标签: c++ qt dictionary qml