如何在QML QTLocation图上添加C QT代码的POI
How to add PoI from C++ Qt code on a QML QtLocation map
qt noob在这里。我正在尝试使用QT5开发桌面应用程序,该应用程序读取具有POI GPS坐标的JSON并将其显示在地图上。唯一能够轻松执行此操作的本地API是QTLocation,显然仅是QML。在发现QML时,我仍然设法将映射集成在我的代码中,甚至是直接添加到QML中的POI,但是我似乎无法通过C 代码在地图上动态创建它们,而我也不喜欢't真的得到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();
}
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()
{
}
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();
好吧,我设法通过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;
}
下一步:使POIS可单击...
相关文章:
- 将 Qt 代码从 createTextureFromId 更新为 createTextureFromNativeObje
- 无法在这个基本的Qt代码片段中找到错误,但我被告知它肯定存在?
- 使用其他编译器编译QT代码
- 为什么我在有关文件编码格式的QT代码中获得了混乱的代码
- 寻求QT代码的解释
- 尝试从 Github 编译 OpenCV QT 代码时出错
- 如何将 Double 从 Qt c++ 代码传递到 QML 代码
- 尝试在代码块中编译 Qt/C++ 代码
- RTKlib(C库)与QT(C++代码)
- 如何在QML QTLocation图上添加C QT代码的POI
- 获取 QT 代码的普通C++实现
- 链接 Qwt 库时 Qt 代码中的分段错误
- QT代码的组织
- Python中的Qt C++代码,PyQt4
- 避免在使用ccache / clang编译Qt代码时出现多余的警告
- 如何将Qt代码分解为单独的部分
- 在Linux(Ubuntu 13.10和14.04)下运行Qt C++代码,而无需QtCoreApplication/Q
- Qt代码编辑器在右侧的区域中显示行号
- 如何优化涉及大量sql查询的Qt代码块
- 在Linux中编译windows Qt代码以及库中的更改