第9部份:文件保存
来源:互联网 发布:统计学教材 知乎 编辑:程序博客网 时间:2024/05/01 16:48
原文地址:http://www.dazzle.plus.com/linux/QtCreator/part09.htm
第9部份:文件保存
XML文件保存
这里我们让用户以XML格式文件保存他们的模拟数据。我们添加一个新的文件菜单动作“另存为...”,使用QFileDialog中的功能让用户选择文件名和存储目录,并使用QXmlStreamWriter来编写XML格式文件。
增强MainWindow
mainwindow.h
我们需要添加一个公共槽方法接收用户选择新的菜单动作的信号。
bool fileSaveAs(); // 如果保存成功返回true
mainwindow.cpp
引入类QFileDialog,QXmlStreamWriter和QDateTime头文件。
#include <QFileDialog>#include <QXmlStreamWriter>#include <QDateTime>
在构造函数里更新创建菜单行代码,返回的指针存储在一个本地变量。
QMenu* fileMenu = menuBar()->addMenu( "&File" );
我们仍然在构造函数里创建并添加一个新的菜单保存动作。
// 创建文件菜单项 QAction* saveAction = fileMenu->addAction( "&Save As...", this, SLOT(fileSaveAs()) ); saveAction->setShortcut( QKeySequence::Save );
最后我们添加新的公共槽方法代码。在这个槽方法里我们询问用户文件名和文件保存目录,判断是否可以创建文件,然后使用QXmlStreamerWriter编写一份XML文件。在XML文件里我们创建一个“qsimulate”元素设置一些详实的信息,然后调用场景的一个新方法添加更详细的信息。如果XML文件被创建成功,槽返回真,否则返回假。
/************************************ fileSaveAs *************************************/bool MainWindow::fileSaveAs(){ // 用户选择的文件名和文件保存目录 QString filename = QFileDialog::getSaveFileName(); if ( filename.isEmpty() ) return false; // 打开文件并判断是否可写 QFile file( filename ); if ( !file.open( QIODevice::WriteOnly ) ) { showMessage( QString("Failed to write to '%1'").arg(filename) ); return false; } // 打开xml流,写入模拟数据 QXmlStreamWriter stream( &file ); stream.setAutoFormatting( true ); stream.writeStartDocument(); stream.writeStartElement( "qsimulate" ); stream.writeAttribute( "version", "2009-05" ); stream.writeAttribute( "user", QString(getenv("USERNAME")) ); stream.writeAttribute( "when", QDateTime::currentDateTime().toString(Qt::ISODate) ); m_scene->writeStream( &stream ); stream.writeEndDocument(); // 关闭文件,显示消息 file.close(); showMessage( QString("Saved to '%1'").arg(filename) ); return true;}
增强scene
scene.h
添加类QXmlStreamWriter的前置定义。
class QXmlStreamWriter;
添加一个场景的新的公共方法定义,使用QXmlStreamWriter写模拟数据。
void writeStream( QXmlStreamWriter* ); // 写场景数据到xml流
scene.cpp
引入类QXmlStreamWriter头文件。
#include <QXmlStreamWriter>
添加场景新方法代码。这个方法里为场景里的每个电台创建一个“station”元素和它的x,y坐标属性。
/************************************ writeStream ************************************/void Scene::writeStream( QXmlStreamWriter* stream ){ // 写电台数据到xml流 foreach( QGraphicsItem* item, items() ) { Station* station = dynamic_cast<Station*>( item ); if ( station ) { stream->writeEmptyElement( "station" ); stream->writeAttribute( "x", QString("%1").arg(station->x()) ); stream->writeAttribute( "y", QString("%1").arg(station->y()) ); } }}
编译和运行
当你尝试运行程序新的代码将自动被编译。测试程序,保存一份新的文件,检查文件内容。
下面的小例子是我们程序保存的文件。
<?xml version="1.0" encoding="UTF-8"?><qsimulate version="2009-05" user="crookr" when="2009-11-06T23:38:47"> <station x="71" y="151"/> <station x="128" y="94"/> <station x="202" y="145"/> <station x="211" y="55"/> <station x="298" y="77"/> <station x="295" y="149"/> <station x="31" y="75"/></qsimulate>
- 第9部份:文件保存
- 第10部份:文件导入
- 第1部份:开始
- 第4部份:增强状态栏
- 第3部份:添加一个显示区域
- 第6部份:移动和删除项
- 第7部份:添加一个撤销堆栈
- 第8部份:实现撤销命令
- 第11部份:打印和打印预览
- 第12部份:新建和退出
- 软件工程 第2部份 软件生存周期与软件过程
- 第2部份:添加一个菜单栏和状态栏
- 第5部份:在显示区域上绘画
- 第15周 项目二 用文件保存的学生名单
- 第15周 项目2 用文件保存学生名单
- 第3周项目5-读入文件,保存数据
- 第14周项目2用文件保存的学生名单
- 第13周-项目2-用文件保存的学生名单
- 开发者须知 HTML5 的15个新特性
- 期中考试2
- Android 基于ImageSwitcher实现的左右切换图片
- Cocos2d-x 帧动画
- LED 驱动器应用中升压转换器的简单开路保护
- 第9部份:文件保存
- 深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)
- MySQL单列索引和联合索引
- php 5.3.6中php-fpm 配置
- MFC中CString转换成char数组的问题
- 密码输入框提预先提示后内容效果实现
- Android应用程序 --- WakeLock 保持后台唤醒状态
- 理解核心态和用户态
- TeXShop - Mac下的LaTeX环境