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

server/2025/2/8 17:16:09/

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/server/165992.html

相关文章

GitHub 使用教程:从入门到进阶

1. GitHub账号注册 访问 GitHub 官网 (https://github.com)点击 “Sign up” 按钮填写用户名、邮箱和密码验证邮箱完成注册 2. 基础配置 2.1 安装Git 访问 Git 官网下载安装包运行安装程序&#xff0c;按提示完成安装打开终端&#xff0c;设置用户信息&#xff1a; git co…

34.Word:公积金管理中心文员小谢【35】

目录 Word2.docx​ 业务网点素材.docx​ Wordl.docx邮件合并​ Word2.docx F12/另存为&#xff1a;考生文件夹&#xff1a;Word2.docx 布局样式的复制 插入公式&#xff1a;插入→公式→整体大纲→细节&#xff1a;下标/分式/上标/点/括号&#xff08;❌不能手动输入括号&am…

centos虚拟机迁移没有ip的问题

故事背景&#xff0c;我们的centos虚拟机本来是好好的&#xff0c;但是拷贝到其他电脑上就不能分配ip&#xff0c;我个人觉得这个vmware他们软件应该搞定这个啊&#xff0c;因为这个问题是每次都会出现的。 网络选桥接 网络启动失败 service network restart Restarting netw…

CVPR2021 | VMI-FGSM VNI-FGSM | 通过方差调整增强对抗攻击的可迁移性

Enhancing the Transferability of Adversarial Attacks through Variance Tuning 摘要-Abstract引言-Introduction相关工作-Related Work方法-Methodology动机-Motivation基于方差调整的梯度攻击-Variance Tuning Gradient-based Attacks不同攻击的关系-Relationships among V…

tolua[一]框架搭建,运行example

一.安装tolua https://github.com/topameng/tolua 下载LuaFramework_UGUI的zip 将Assets目录拷贝到项目根目录下 提示确认注册&#xff0c;遇到这个对话框点确定即可 生成如下目录 二.LuaFramework->Build Windows Resource 接下来的目标是将这个main场景跑起来 需要先执行…

PHP PDO 教程

PHP PDO 教程 概述 PHP PDO&#xff08;PHP Data Objects&#xff09;扩展为PHP提供了数据访问抽象层。PDO可以让你使用相同的接口访问多种数据库系统&#xff0c;这大大简化了数据库操作。本文将详细介绍PHP PDO的基本用法、优势以及在实际开发中的应用。 ##PDO 简介 PDO是…

Linux 系统上安装 Docker 方法详解与比较

Docker 是现代 DevOps 和容器化应用开发的重要工具&#xff0c;它简化了应用的部署和管理流程。本文将详细介绍在 Linux 系统上安装 Docker 的多种方法&#xff0c;并对它们的适用场景、优缺点进行对比&#xff0c;确保读者能够根据自身需求选择最优方案。 1. 官方推荐的安装方…

【wiki知识库】07.用户管理后端SpringBoot部分

目录 一、今日目标 二、&#x1f388;SpringBoot部分类的添加 2.1 使用逆向工程新增User模块 2.2 UserQueryParam添加 2.3 UserSaveParam添加 2.4 UserResetPasswordParam添加 2.5 UserQueryVo添加 2.6 SnowFlake工具类 三、&#x1f686;后端新增接口 3.1 /user/li…