欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > QWidget中嵌入QQuickWidget,从qml端鼠标获取经纬度点(double类型),发到c++端。把c++端的对象暴露个qml端调用

QWidget中嵌入QQuickWidget,从qml端鼠标获取经纬度点(double类型),发到c++端。把c++端的对象暴露个qml端调用

2025/2/8 18:20:41 来源:https://blog.csdn.net/sunflower_2020/article/details/145474934  浏览:    关键词: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_OBJECTpublic: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_polygonproperty var list: [[]]property var templist: []property var points: []anchors.fill: parenthoverEnabled: true;enabled:polygon_flag != 0onClicked: {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()}}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com