QWidget中嵌入QQuickWidget,从qml端鼠标获取经纬度点(double类型),发到c++端。把c++端的对象暴露个qml端调用
qml端鼠标选取点
c++端接收
c++端
先写一个类,专门用来接收,取名MouseDrawAirspace
#ifndef MOUSEDRAWAIRSPACE_H
#define MOUSEDRAWAIRSPACE_H
#include <QVariant>
#include <QObject>
#include <QGeoCoordinate>
#include <QDebug>
#include <QList>
class MouseDrawAirspace : public QObject
{
Q_OBJECT
public:
explicit MouseDrawAirspace(QObject *parent=nullptr);
~MouseDrawAirspace();
public slots:
// 槽函数,用于接收多边形点坐标
void receivePoints( QVariantList points) ;
void receiveCoordinates(QVector<QPointF> coordinates1);
public:
QList<QPointF>store_multiPolyon;
};
#endif // MOUSEDRAWAIRSPACE_H
cpp
#include "mousedrawairspace.h"
MouseDrawAirspace::MouseDrawAirspace(QObject *parent):QObject(parent)
{
//我要使用这种类型,作为对外通信,所以先注册吧,之后要用
qRegisterMetaType <QList<QPointF>>(" QList<QPointF>");
}
MouseDrawAirspace::~MouseDrawAirspace()
{
}
void MouseDrawAirspace::receivePoints( QVariantList points)
{
for (const auto& pointVariant : points) {
// 将 QVariant 转换为 QVariantList,代表单个坐标点
QVariantList pointList = pointVariant.toList();
if (pointList.size() == 2)
{
// 获取 x 和 y 坐标
double x = pointList[0].toDouble();
double y = pointList[1].toDouble();
QPointF p;
p.setX(x);
p.setY(y);
store_multiPolyon.append(p);
qDebug() << "Received point: (" << x << ", " << y << ")";
}
}
}
void MouseDrawAirspace::receiveCoordinates(QVector<QPointF> coordinates1)
{
for (const auto &point : coordinates1) {
qDebug() << "Coordinate:" << point;
}
}
通过上下文,把接口暴露个qml端。
意思:qml端可以调用这个类对象
//手动拾取空域点
mouseDrawAirSpace=new MouseDrawAirspace();
// MouseDrawAirspace temdddd;
ui->quickWidget->rootContext()->setContextProperty("MouseDrawAirspace",mouseDrawAirSpace);
来看qml端
核心代码
MouseArea{
//用来存放鼠标选取的经纬度点
property var points: []
onClicked: {
var coord = the_map.toCoordinate(Qt.point(mouseX,mouseY),false);
templist.push(coord);
}
//双击后,把里面保存到经纬度点发到c++端
onDoubleClicked: {
// 遍历 templist 提取经纬度并添加到 points 中
for (var i = 0; i < templist.length; i++)
{
var currentCoordinate = templist[i];
var longti = currentCoordinate.longitude;
var lati = currentCoordinate.latitude;
var point1 = [longti, lati];
points.push(point1);
}
//MouseDrawAirspace就是通过上下文注册的那个对象
MouseDrawAirspace.receivePoints(points)
}
}
全部模块代码
/****************双击生成多边形******************/
MouseArea{
id:mouse_polygon
property var list: [[]]
property var templist: []
property var points: []
anchors.fill: parent
hoverEnabled: true;
enabled:polygon_flag != 0
onClicked: {
if(polygon_flag == 1 && mouse.button == Qt.LeftButton)
{
if(!ruler)
{
ruler = ruler_comp.createObject(the_map);
if(ruler)
{
the_map.addMapItemGroup(ruler)
}
}
if(ruler){
console.log("111 " + i);
var coord = the_map.toCoordinate(Qt.point(mouseX,mouseY),false);
templist.push(coord);
console.log(item_rect_point_List)
ruler.appendPoint(coord);
}
}
}
onPositionChanged: {
if(polygon_flag === 1)
{
if(ruler)
{
var coord = the_map.toCoordinate(Qt.point(mouseX,mouseY),false);
ruler.followMouse(coord);
update()
}
}
}
onDoubleClicked: {
if(polygon_flag === 1){
if(ruler)
{
ruler.closePath();
ruler.destoryLine();
ruler = null;
}
var component = Qt.createComponent("MyPolygon.qml");
console.log(component.errorString());
if(component.status === Component.Ready)
{
var polygon = component.createObject(the_map)
polygon._list = templist
// 遍历 templist 提取经纬度并添加到 points 中
for (var i = 0; i < templist.length; i++)
{
var currentCoordinate = templist[i];
var longti = currentCoordinate.longitude;
var lati = currentCoordinate.latitude;
var point1 = [longti, lati];
points.push(point1);
}
// 发送坐标点到 C++ 端
MouseDrawAirspace.receivePoints(points)
//测试,通不通
// var coordinates = []
// for (var i = 0; i < 30; ++i) {
// // 这里简单生成一些示例坐标点,你可以根据实际需求修改
// coordinates.push(Qt.point(i * 10.2, i * 20))
// }
// MouseDrawAirspace.receiveCoordinates(points)
the_map.addMapItemGroup(polygon)
}
templist.splice(0,templist.length)
polygon_flag = 0;
update()
}
}
}