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>
基于上述结构,可以设计读文件的思路。