当前位置: 首页 > news >正文

基于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.lryc.cn/news/134300.html

相关文章:

  • 树结构使用实例---实现数组和树结构的转换
  • 论文阅读_条件控制_ControlNet
  • 全链路数据湖开发治理解决方案2.0重磅升级,全面增强数据入湖、调度和治理能力
  • 【算法题】2769. 找出最大的可达成数字
  • 023:vue中解决el-date-picker更改样式不生效问题
  • 爬虫借助代理会让网速快点吗?
  • 探索智能文字识别:技术、应用与发展前景
  • STL——list用法
  • Linux的基础指令
  • 深入浅出Pytorch函数——torch.nn.init.normal_
  • Vue.js知识点学习的一点笔记
  • Sui第四轮资助:16个团队瓜分
  • ATC模型转换环境问题案例
  • dart其他语法
  • C++11并发与多线程笔记(7) 单例设计模式共享数据分析、解决,call_once
  • FANUC机器人加减速倍率指令ACC的使用方法说明
  • 奥威BI数据可视化工具:360度呈现数据,告别枯燥表格
  • C# Linq源码分析之Take (三)
  • Linux journalctl命令详解(journalctl指令)(systemd服务默认日志管理工具)
  • 学习内容--
  • Stable Diffusion:使用自己的数据集微调训练LoRA模型
  • 软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章一
  • 06 mysql all查询 和 主键查询 和 非索引列查询
  • 黑马点评-项目集成git及redis实现短信验证码登录
  • mac苹果电脑怎么运行Windows软件?怎么安装Win虚拟机?
  • Jmeter对websocket进行测试
  • 从2023年世界机器人大会发现机器人新趋势
  • Kafka单节点部署
  • 生成式AI和大语言模型 Generative AI LLMs
  • Obsidian 入门使用手册