基于QT4的GPX文件编辑器开发

GPX文件是记录地理点的文件,本质是一种xml文件。GPX文件目前没有很好的编辑器,因此作者决定开发一款无需安装的绿色编辑器。

在QT4开发中,XML可以用DOM来实现,但其逻辑并不是很清晰。使用模型视图反而会更加可读。因此在开发中,使用model-view模式来实现数据读写。

1 需求

1 新建gpx文件

2 打开gpx文件

3 保存gpx文件

4 编辑gpx头

5 编辑gpx地理点,包括插入行,删除行,编辑字段

6 地理点可视化

2 表格视图开发流程

1 新建UI工程

2 引入QCustomPlot和TableView

3 提升部件,并在UI界面下设计功能菜单。为了让代码更好读,所有的控件都用UI生成。

菜单目前先实现三个最基本的功能,就是新建,打开,保存。

4 新建逻辑

新建面临两种情况:

  • 1当前未打开任何文件,直接新建
  • 2打开文件且已修改但未保存,需要先保存再新建

代码如下:

// 若当前为修改状态 询问是否保存if(windowTitle().contains(" *")){QMessageBox::StandardButton res;res = QMessageBox::question(this,"Note","Save changes?",QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel,QMessageBox::Save);if(res==QMessageBox::Save)on_actionSave_triggered();else if(res==QMessageBox::Cancel)return;}// 指定新建文件名QString tempName = QFileDialog::getSaveFileName(this,tr("New file"),"", "*.gpx");if(tempName.isEmpty())return;// 刷新文件名和模型fileName = tempName;model->removeRows(0,model->rowCount(QModelIndex()),QModelIndex());// 新建文件QFile file(fileName);if(!file.open(QIODevice::WriteOnly))return;file.close();// 更新标题*标记setWindowTitle(winName+" - "+fileName.replace("/","\\")+" *");

如何判断是否打开了未保存的文件?主要靠标题栏的*号。如果有*号则调用保存的槽函数。

指定文件名时,如果放弃指定就直接返回。

5 打开逻辑

打开面临两个情况,1是未打开任何文件,2是打开的文件已修改未保存。和新建一样,需要对标题栏的*号进行判断。

判断后,就打开指定文件。打开文件涉及到文件的读取。可以先看下gpx文件结构。gpx本质上是一种xml文本文件。

<?xml>

 <gpx>

        <metadata>

        <wpt lat="xxx" lon="xxx">

                 <ele>xxx</ele>

                 <time>2022-07-10T04:12:29Z</time>

                  <name>xxx</name>

                  <cmt>2022-07-10 12:12:29pm</cmt>

                  <sym>Flag, Blue</sym>

        </wpt>

        ...若干个wpt

</gpx>

基于上述结构,可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏找不到msvcr100.dll解决方法,常见的三种解决方法

在计算机领域&#xff0c;msvcr100.dll是一个非常重要的动态链接库文件。它是Microsoft Visual C 2010 Redistributable的一部分&#xff0c;用于支持Visual Studio 2010的开发环境。然而&#xff0c;在某些情况下&#xff0c;msvcr100.dll可能会出现问题&#xff0c;导致程序无…

正则表达式在网页处理中的应用四则

正则表达式在网页处理中的应用四则 正则表达式(Regular Expression)为字符串模式匹配提供了一种高效、方便的方法。几乎所有高级语言都提供了对正则表达式的支持,或者提供了现成的代码库供调用。本文以ASP环境中常见的处理任务为例,介绍正则表达式的应用技巧。 一、检验密…

【Leetcode】104.二叉树的最大深度

一、题目 1、题目描述 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例1: 输入:root = [3,9,20,null,null,15,7] 输出:3示例2: 输入:root = [1,null,2] 输出:2提示: 树中节点的数量在 [0, 104…

关于航插接口

航插接口&#xff0c;又称为航空插头或航空插座&#xff0c;是一种用于在飞机和地面设备之间传输电力、信号和数据的电气连接系统。它是一种标准化的接口&#xff0c;用于连接不同类型和规格的航空电子设备&#xff0c;如雷达、通信系统、导航设备等。航插接口的设计和制造需要…

嵌入式设备应用开发(qt界面开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 linux界面开发有很多的方案可以选。比如说lvgl、minigui、ftk之类的。但是,这么多年来,一直屹立不倒的还是qt。相比较其他几种方案,qt支持多个平台,这里面就包括了linux平台。此…

前端面试:【HTML】语义化标签、表单、媒体元素

HTML&#xff08;超文本标记语言&#xff09;是构建网页内容的基础&#xff0c;它通过一系列标签来描述页面的结构和内容。在这篇文章中&#xff0c;我们将探讨HTML的基础知识&#xff0c;包括语义化标签、表单和媒体元素。 语义化标签&#xff1a;赋予内容更多意义 语义化标签…

Spring Boot 集成 WebSocket 实现服务端推送消息到客户端

WebSocket 简介 WebSocket 协议是基于 TCP 的一种新的网络协议&#xff0c;它实现了浏览器与服务器全双工&#xff08;full-duplex&#xff09;通信—允许服务器主动发送信息给客户端&#xff0c;这样就可以实现从客户端发送消息到服务器&#xff0c;而服务器又可以转发消息到客…

【Django】Task3 外键的使用、Queryset和Instance

【Django】Task3 外键的使用、Queryset和Instance Task3主要理解数据库外键的使用场景&#xff0c;了解Queryset的功能&#xff0c;通过编写代码体验Queryset中对数据库实例的curd操作&#xff0c;同时了解到Instance的定义。 1.外键的使用 1.1什么是外键 数据表外键是数据…

vue下拉框赋值

另一个页面调用方法赋值 负责下拉框回显 methods: {// 按钮方法jieyue(row) {this.openDialog true;this.$nextTick(() > {this.$refs.testDialog.init(row);});},页面进入请求下拉框数据 // 窗口初始化方法&#xff0c;nextTick方法可以添加逻辑&#xff0c;如打开窗口时查…

智能在线客服系统,客户问题接待更及时

优质的客户服务可以提高客户的满意度和忠诚度&#xff0c;从而为企业带来更多的商业机会。智能在线客服系统&#xff0c;是指通过人工智能技术和自然语言处理技术&#xff0c;将客户的问题自动化地分配给相应的客服人员&#xff0c;从而实现客户问题的快速解答。相比传统的客服…

树结构使用实例---实现数组和树结构的转换

文章目录 一、为什么要用树结构&#xff1f;二、使用步骤 1.引入相关json2.树结构的转换总结 一、为什么要用树结构&#xff1f; 本文将讲述一个实例&#xff0c;构造一棵树来实现数组和tree的转换&#xff0c;这在前端树结构中是经常遇到的 后端返回树结构方便管理&#xff…

统计学补充概念08-kmeans

概念 K均值&#xff08;K-Means&#xff09;是一种常用的聚类算法&#xff0c;用于将数据集分成预先指定数量的聚类。K均值的目标是将数据点分配到K个聚类中&#xff0c;使得每个数据点都属于距离其最近的聚类中心。 基本步骤 选择聚类数量K&#xff1a;首先需要选择要形成的…

10113: string (7) stringstream 换衣间

10113: string (7) stringstream 换衣间 时间限制: 1.000 Sec 内存限制: 128 MB 提交: 45 解决: 41 [命题人:][下载数据: 30] 提交状态报告 题目描述 把字符串类型的数字转换成整数*字符串的长度倍数。 输入 一行字符串的数字 输出 该数字的字符串长度的倍数 样…

装饰器模式来啦

装饰器模式是继承的替代模式&#xff0c;本质上也是通过对象抽象和对象组合的形式完成。装饰器模式也很少用在设计初始阶段&#xff0c;一般在重构或代码扩展阶段。当需要对现有的对象的行为进行增强时使用。 一、装饰器模式 装饰器模式和组合模式放在一起看是有一些相似的&a…

内核日志过滤

本操作以centos为例。 1、不想把日志存入到 /var/log/messages中&#xff0c;转存到其他文件 >1.1、修改配置文件 /etc/rsyslog.conf vim /etc/rsyslog.conf# 添加以下代码if $programname kernel and ($msg contains hexdump or $msg contains shentong_data_file) then …

防火墙firewall

一、什么是防火墙 二、iptables 1、iptables介绍 2、实验 138的已经被拒绝&#xff0c;1可以 三、firewalld 1、firewalld简介 关闭iptables&#xff0c;开启firewalld&#xff0c;curl不能使用&#xff0c;远程连接ssh可以使用 添加80端口 这样写也可以&#xff1a;添加http…

ffmpeg简介

1.什么是ffmpeg ffmpeg即使一款音视频编解码工具&#xff0c;同时也是一组音视频编解码开发套件&#xff0c;作为编解码开发套件&#xff0c;它为开发者提供了丰富的音视频处理的调用接口。 ffmpeg提供了多种媒体格式的封装和解封装&#xff0c;包括多种音视频编码、多种协议…

【服务器】Strace显示后台进程输出

今天有小朋友遇到一个问题 她想把2331509和2854637这两个进程调到前台来&#xff0c;以便于在当前shell查看这两个python进程的实时输出 我第一反应是用jobs -l然后fg &#xff08;参考这里&#xff09; 但是发现jobs -l根本没有输出&#xff1a; 原因是jobs看的是当前ses…

通过Matlab编程分析微分方程、SS模型、TF模型、ZPK模型的关系

微分方程、SS模型、TF模型、ZPK模型的关系 一、Matlab编程 微分方程、SS模型、TF模型、ZPK模型的关系二、对系统输出进行微分计算三、对系统输出进行积分计算四、总结五、系统的零点与极点的物理意义参考 &#xff1a;[https://www.zhihu.com/question/22031360/answer/3073452…