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

news/2025/2/10 12:21:50/

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

http://www.ppmy.cn/news/1570856.html

相关文章

详解正则表达式与案例

文章目录 1. 正则表达式定义2. 基础正则表达式&#xff08;BRE&#xff09;3. 扩展正则表达式&#xff08;ERE&#xff09;4. 通配符&#xff08;Wildcards&#xff09;5. 案例与分析**案例1&#xff1a;提取IP地址****案例2&#xff1a;批量重命名文件****案例3&#xff1a;过…

ToDesk云电脑将终结显卡溢价,Web端浏览器、安卓、IOS免费试用

随着市面上显卡需求增多&#xff0c;高端显卡供给却减少&#xff0c;显卡价格一路水涨船高。更有不少炒家以高于官方指导价几千元的价格借机囤货&#xff0c;计划加价后转手卖向市场&#xff0c;优质的显卡能够大幅提升电脑设备产品力&#xff0c;加之市场供需关系失衡&#xf…

开启蓝耘之旅:DeepSeek R1 模型在智算平台的起步教程

----------------------------------------------------------我的个人主页-------------------- 动动你的手指----------------------------------------点赞&#x1f44d; 收藏❤--------------------------------------------------------------- 引言 在深度学习的广袤领…

DeepSeek:从入门到精通(100页PDF)

今天下载了一份《DeepSeek&#xff1a;从入门到精通》&#xff0c;文章从不同角度进行分析&#xff0c;非常全面&#xff0c;分享给大家。 PDF有100多页&#xff0c;我汇总了提纲如下&#xff1a; 一、DeepSeek 简介 DeepSeek 是一家专注通用人工智能&#xff08;AGI&#x…

mmap 文件映射

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; mmap介绍&#x1f98b; 基本说明&#x1f98b; 参数介绍&#x1f98b; 返回值 二&#xff1a;&#x1f525; demo代码&#x1f98b; 写入映射&#x1f98b…

SOME/IP--协议英文原文讲解5

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 这一章节…

ORB-SLAM2源码学习:Tracking.cc:GrabImageStereo、GrabImageRGBD、GrabImageMonocular处理图像

前言 该部分函数在Tracking.cc源文件中定义&#xff0c;用于处理图像。 1.函数作用&#xff1a; 1.GrabImageStereo 函数的主要作用是处理输入的双目图像&#xff08;左视图和右视图&#xff09;&#xff0c;进行必要的预处理&#xff08;颜色转换&#xff09;&#xff0c;创…

react使用if判断

1、第一种 function Dade(req:any){console.log(req)if(req.data.id 1){return <span>66666</span>}return <span style{{color:"red"}}>8888</span>}2、使用 {win.map((req,index) > ( <> <Dade data{req}/>{req.id 1 ?…