4.存储功能
存储功能可以选择进行本地存储,云存储,数据库存储等等...由于我们这个是个小练习,于是选择最简单的本地存储。这里的构想就是在本地同目录下创建一个Counter.txt的文件对文章总数进行保存;在每次打开应用时对该目录下的文件内容进行读取,将读取到的值赋值到标签中,当关闭应用时,将标签中的总数读取出来然后保存到文件中。这样就可以实现本地数据存储了。
既然选择了文件操作的方式,我们要声明一个全局变量保存文件的路径,这里使用的是相对路径,即该exe文件同目录下。
//定义文件路径;该文件只储存total数
QString path = "counter.txt";//相对路径
// QString path = "D:/QT/QT_Code/Counter/Counter/counter.txt";//绝对路径
在构造函数中写入打开应用时对文件的操作流程:
- 判断文件是否存在
- 存在:
- 加载该文件,判断文件是否有内容:
- 有内容:读取文件内容并赋值
- 无内容:读取总数并向文件写入内容
- 不存在:
- 创建并加载文件,向文件中写内容
//判断文件是否存在
QFileInfo fileInfo(path);
if (fileInfo.exists() && fileInfo.isFile()) {
// 文件存在
QFile file(path);//加载该文件
if(file.open(QIODevice::ReadWrite))//可读可写方式打开
{
if(file.size() > 0)//文件有内容
{
QTextStream in(&file);//创建对象in并以file为其数据源
TotalValueNow = in.readAll();//读文件内容
}
else//文件无内容
{
file.write(TotalValueNow.toUtf8());//写入数据
}
}
file.close();
}
else
{
// 文件不存在
QFile file(path);//创建并加载文件
file.write(TotalValueNow.toUtf8());//写文件
file.close();
}
在析构函数中写入当窗口应用关闭时的操作:
QString value = ui->label_total->text();//读取总数数据
QFile file(path);//加载文件
file.open(QIODevice::WriteOnly);//只写方式打开文件
file.write(value.toUtf8());//写入数据
file.close();//关闭文件
编译成功!!!
三.代码总览
所有代码都在mainwindow.cpp中:
#include "mainwindow.h" #include "ui_mainwindow.h" #include "QFileInfo" #define Target_article 60 //定义文件路径;该文件只储存total数 QString path = "counter.txt";//相对路径 // QString path = "D:/QT/QT_Code/Counter/Counter/counter.txt";//绝对路径 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QString TotalValueNow = "0"; //判断文件是否存在 QFileInfo fileInfo(path); if (fileInfo.exists() && fileInfo.isFile()) { // 文件存在 QFile file(path);//加载该文件 if(file.open(QIODevice::ReadWrite))//可读可写方式打开 { if(file.size() > 0)//文件有内容 { QTextStream in(&file);//创建对象in并以file为其数据源 TotalValueNow = in.readAll();//读文件内容 } else//文件无内容 { file.write(TotalValueNow.toUtf8());//写入数据 } } file.close(); } else { // 文件不存在 QFile file(path);//创建并加载文件 file.write(TotalValueNow.toUtf8());//写文件 file.close(); } //设置Label初始值为0 ui->label_total->setText(TotalValueNow); //初始值为Target_article ui->label_difference->setText(QString::number(Target_article - TotalValueNow.toInt())); } MainWindow::~MainWindow() { QString value = ui->label_total->text();//读取总数数据 QFile file(path);//加载文件 file.open(QIODevice::WriteOnly);//只写方式打开文件 file.write(value.toUtf8());//写入数据 file.close();//关闭文件 delete ui; } void MainWindow::on_pushButton_add_clicked() { int clicked_ButtonValue = ui->label_total->text().toInt();//读取标签中的数据存到变量里 clicked_ButtonValue ++;//数据+1 ui->label_total->setText(QString::number(clicked_ButtonValue));//设置总数标签文本 ui->label_difference->setText(QString::number(Target_article - clicked_ButtonValue));//设置差值标签文本 } void MainWindow::on_pushButton_clicked() { ui->label_total->setText(QString::number(0)); ui->label_difference->setText(QString::number(Target_article - 0)); }
四.打包程序
将下方的编译选项调整为Release模式,编译运行:
于是在对应项目文件夹路径->build->Desktop_Qt_6_7_2_MSVC2019_64bit-Release->release路径下就会出现一个exe可执行文件,将文件复制出来即可使用。
放到一个空文件夹中,可见空文件夹除了这个可执行文件外没有任何文件了:
五.总结
这是笔者第一次独立进行QT窗口开发,比较简陋,望大家海涵。