本文为学习记录,若有错误,请联系作者,谦虚受教。
前言
你看我越是穷途末路 就越是势如破竹.说明
第一种方法是从QTextedit 窗口中导出txt文件。
第二种方法是在程序执行过程中,打印日志,导出txt文件。
一、生成txt文件
1.h文件
在头文件中需要添加QFile头文件
#include<QFile>
#include<QTextStream>
#include<QFileDialog>
// QTextStream是一个非常强大的类,它可以对IO设备,QString,QByteArray等类进行方便的读写操作
//QFileDialog 是Qt 中用于文件打开和保存的对话框
public:
QFile file;
2.cpp文件
目的:点击一个按键时,将窗口显示的内容以文本形式保存下来。保存在自己设定的路径中。
.cpp文件代码如下
//保存窗口
void MainWindow::on_savetext_recv_clicked()
{
//选择保存路径
QString textfileName = QFileDialog::getOpenFileName(this, tr("save text"),
"",
tr("text(*.txt)"));
QFile file(textfileName);
if(!file.open(QFile::WriteOnly|QFile::Text))
{
QMessageBox::information(this,"警告","请选择正确的文件!");
return;
}
QTextStream out(&file); //QTextStream会自动将 Unicode 编码同操作系统的编码进行转换
out<<ui->text_recv->toPlainText();
}
二、生成log文件
调用
QString strLog = "" , strTemp;
strLog += "发送数据:";
for(int i=0;i<sendLen;i++)
{
strTemp.sprintf("%02X",sendBuf[i]);
strLog += strTemp + " ";
}
strLog += "\r\n";
strLog += "接收数据:";
for(int i=0;i<ralen;i++)
{
strTemp.sprintf("%02X",rcvBuff[i]);
strLog += strTemp + " ";
}
SaveLogTxt(strLog);
导出的文件默认保存在程序.exe的绝对路径下。
void CusProtocol::SaveLogTxt(QString error)
{
QDateTime currenttime = QDateTime::currentDateTime();
QString strDate = currenttime.toString("yyyy-MM-dd");
QString strTime =currenttime.toString(" hh:mm:ss");
QString path = QCoreApplication::applicationDirPath();
QString strPath = path + strDate + "log.txt";
QFile file(strPath);
bool isOK = file.open(QIODevice::WriteOnly|QIODevice::Append);
if(isOK)
{
QTextStream stream(&file);
stream<<strDate<<strTime<<"\r\n";
stream<<error<<"\r\n";
}
file.close();
}
三、删除log文件
//删除日志
void CRunThread::ClearLogData()
{
//1.获取当前日期
QDateTime currenttime = QDateTime::currentDateTime();
QString strDate = currenttime.toString("yyyy-MM-dd");
//2.获取文件夹路径,遍历文件夹
QString path = QCoreApplication::applicationDirPath();
QString logPath = path ;
QStringList foldernames;
QStringList filters;
filters << "*.txt";
QDir dir(logPath);
//搜索当前目录符合条件的文件
foreach(QString file, dir.entryList(filters, QDir::Files))
foldernames += logPath + '/' + file;
//QFileInfoList fileList = dir.entryInfoList();//当前文件夹下只有日志文件,也可以直接获取全部文件
//3.比较日期
if (foldernames.size() > 5)
{
foreach(QString fileName, foldernames)
{
//获取文件的创建时间
QFileInfo info(fileName);
QDateTime dt = info.created();//获取文件创建时间
qint64 days = dt.daysTo(currenttime);//获取文件相对于当前时间的天数
if (days > 5)
{
QFile::remove(fileName);//大于5天,移除文件
}
}
}
}
四、文件夹文件数量
m_Work.m_strTxtFilePath = QFileDialog::getExistingDirectory(
this, "choose src Directory",
"/");
//获取文件夹数量
QString folderpath = "文件夹路径";
QDir *dir = new QDir(m_Work.m_strTxtFilePath);
QStringList filter;
QFileInfoList fileInfoList = dir->entryInfoList(filter);
m_Work.m_FileNum = fileInfoList.count()-2;
五、读取文件
QDir dir(m_strTxtFilePath);
QStringList nameFilters;
nameFilters << "*.TXT" ;
//获取名字
QStringList files = dir.entryList(nameFilters, QDir::Files | QDir::Readable, QDir::Name);
QList<QVariant> allRowData[m_FileNum];
for (int i=0; i<m_FileNum; i++)
{
// 打开txt文件
QString name = m_strNmType + "nm "+QString::number(i) +".TXT";
QString path = m_strTxtFilePath + "/" + name;
QFile f(path);
if (!f.open(QIODevice::ReadOnly | QIODevice::Text))
{
return;
}
//读取txt 流
QTextStream txtInput(&f);
int numK = 0;
//QList<QVariant> allRowData;
while (!txtInput.atEnd())
{
//读取每一行的数据
numK++;
QString lineStr;
QStringList linedata;
lineStr = txtInput.readLine();
// astr.append(lineStr);
//根据空格来分成多个数据
linedata = lineStr.split(" ");
/* while (!linedata.isEmpty())
{
aRowData.append((linedata.front()));
linedata.pop_front();
}*/
//将多个数据转为QVariant类型(这个是qt的任意类型)
allRowData[i].append(QVariant(linedata));
}
}
六、生成表格
//写入excel
QFile file(m_strDirFilePath);
bool isOK = file.open(QIODevice::WriteOnly | QIODevice::Append);
if(!isOK) return;
QString strW = "",strTemp ="";
QTextStream out(&file);
out.setCodec("utf-8");
//首行
out << tr("波长") << "\t" ;
for(int i=0; i<m_FileNum;i++)
{
out <<QString::number(i) << "\t";
}
out << "\r\n";
int NUM = allRowData[0].size();
for(int it =0; it<NUM; it++)
{
QString strAll = "";
for(int i=0; i<m_FileNum; i++)
{
qDebug()<<i;
strTemp = allRowData[i][it].toString();
if(i == 0)
{
strAll += allRowData[i][it].toString() + "\t";
}
else {
QStringList INFO = strTemp.split("\t");
strAll += INFO[1];
strAll += "\t";
}
}
out << strAll << "\r\n";
}
file.close();
七、读取文件夹内文件名
/********************************************************
输入:文件路径;保存全部文件名的容器
/********************************************************/
void findFile(const QString& path, std::vector<QString>& fileNames)
{
QDir dir(path);
if(!dir.exists())
{
return;
}
//获取filePath下所有文件夹和文件
dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);//文件夹|文件|不包含./和../
//排序文件夹优先
dir.setSorting(QDir::DirsFirst);
//获取文件夹下所有文件(文件夹+文件)
QFileInfoList list = dir.entryInfoList();
/**********直接获取带文件后缀的文件;如果使用,则只搜索当前文件夹下的文件*************
QStringList filer;
filer << "*.jpg" <<"*.bmp";//设定需要的文件类型(*为所有类型)
QFileInfoList list = dir.entryInfoList(filer);
//QList<QFileInfo> *list= new QList<QFileInfo>(dir.entryInfoList(filter));
/*******************************************************************************/
/**********************只获取文件,只搜索当前文件夹下的文件************************
QStringList list= dir.entryList(filer, QDir::Files | QDir::NoDotAndDotDot);
/*******************************************************************************/
if(list.size() == 0)
{
return;
}
//遍历
for(int i = 0; i < list.size(); i++)
{
QFileInfo fileInfo = list.at(i);
if(fileInfo.isDir())//判断是否为文件夹
{
findFile(fileInfo.filePath(), fileNames);//递归开始
}
else
{
if(fileInfo.suffix() == "bmp")//设定后缀
{
fileNames.emplace_back(list.at(i).fileName());//保存全部文件名
//fileNames.emplace_back(list.at(i).filePath());//保存全部文件路径+文件名
}
}
}
}
总结
善于总结,多进一步。
在认清生活真相之后请你依然热爱生活