目录
一 功能列表
二 架构设计
三 代码实现
四 软件原型效果
五 测试验证
六 项目工程打包发布
七 项目完整源码获取
一 功能列表
- 显示文件路径选择框,仅展示 .txt类型文件可选;
- 读取文本文件,显示到桌面控件中;
- 读取的文件使用多线程处理,不影响显示界面正常操作;
- 读取过来的文件如有修改,需要保存修改部分;
- 读、写文件需要显示处理进度;
- 增加一个列表,用于展示文本文件的类型、大小、行数等。
二 架构设计
如上图所示,一个源文件,使用两个线程来对文件进行读写操作,最后把对文件的读写结果显示到屏幕上面。
三 代码实现
类名 |
作用 |
main.cpp |
程序入口类 |
mainwindow.h mainwindow.cpp |
负责界面交互逻辑处理、数据显示 |
fileinfo.h fileinfo.cpp |
获取文件信息 |
filereadthread.h filereadthread.cpp |
文件读取线程 |
writefilethread.h writefilethread.cpp |
文件写入线程 |
四 软件原型效果
五 测试验证
六 项目工程打包发布
完整程序下载地址: 下载后可直接运行,已经打包为exe运行程序。
https://download.csdn.net/download/XiaoWang_csdn/87742313
七 项目完整源码获取
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "fileinfo.h"
#include "filereadthread.h"
#include <QThread>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
FileInfo *finfo=NULL;
FileReadThread *fthread=NULL;
QThread *mythread=nullptr;
private slots:
void openfile(); //打开文件
void readTextFile(QString str); //接收文件
void showFileReadProgress(qint32 count); //显示已经读取的行数
void showErrorInfo(QString str); //接收错误信息
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include<QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//绑定打开文件菜单信号槽
connect(ui->openfile,SIGNAL(triggered(bool)),this,SLOT(openfile()));
}
MainWindow::~MainWindow()
{
delete ui;
}
//打开文件
void MainWindow::openfile()
{
QString path=QFileDialog::getOpenFileName(this,"文件对话框",".","日志文件(*.log *.txt);;");
//文件路径存在则进行读取操作
if(!path.isEmpty()){
//展示文件信息
finfo=new FileInfo(path);
ui->fileName->setText(finfo->fileName());
ui->fileType->setText(finfo->fileType());
ui->filePath->setText(finfo->filePath());
ui->fileSize->setText(QString::number(finfo->fileSize()/1024)+"KB");
ui->createTime->setText(finfo->fileCreateTime());
ui->uptateTime->setText(finfo->fileUpdateTime());
//启动多线程读取文件
fthread=new FileReadThread(path);
mythread=new QThread;
fthread->moveToThread(mythread); //移动至线程中执行
//绑定信号与槽
connect(mythread,SIGNAL(started()),fthread,SLOT(readFile())); //启动线程并开始执行任务
connect(fthread,SIGNAL(lineText(QString)),this,SLOT(readTextFile(QString)));//接收读取到的文件
connect(fthread,SIGNAL(lineCount(int)),this,SLOT(showFileReadProgress(qint32))); //显示读取进度
connect(mythread,SIGNAL(finished()),mythread,SLOT(deleteLater())); //线程结束删除对象占用的内存
connect(fthread,SIGNAL(errorInfo(QString)),this,SLOT(showErrorInfo(QString))); //接收错误信息
mythread->start(); //启动线程
}
}
//接收文件
void MainWindow::readTextFile(QString str)
{
ui->textEdit->append(str);
}
//显示已经读取的行数
void MainWindow::showFileReadProgress(qint32 count)
{
ui->statusbar->showMessage("正在读取文件的第"+QString::number(count)+"行");
if(count==0) ui->statusbar->showMessage("文件读取完成!");
}
void MainWindow::showErrorInfo(QString str)
{
ui->statusbar->showMessage(str);
}
fileinfo.h
#ifndef FILEINFO_H
#define FILEINFO_H
#include <QObject>
#include<QFileInfo>
class FileInfo : public QObject
{
Q_OBJECT
public:
explicit FileInfo(QObject *parent = nullptr);
FileInfo(QString path);
public:
QString fileName(); //文件名称
QString fileType(); //文本类型
QString filePath();//文件绝对路径
qint64 fileSize();//文件大小
QString fileCreateTime();//文件创建时间
QString fileUpdateTime();//文件修改时间
QString fileProperty();//文件属性
QString fileAll();//文件所有者
QString fileComputer();//计算机名称
private:
QString PATH;
QFileInfo qfileinfo;
};
#endif // FILEINFO_H
fileinfo.cpp
#include "fileinfo.h"
FileInfo::FileInfo(QObject *parent)
: QObject{parent}
{
}
FileInfo::FileInfo(QString path)
{
PATH=path;
qfileinfo.setFile(PATH);
}
QString FileInfo::fileName()
{
return qfileinfo.fileName();
}
QString FileInfo::fileType()
{
return qfileinfo.fileName().split(".")[1];
}
QString FileInfo::filePath()
{
return qfileinfo.absoluteFilePath();
}
qint64 FileInfo::fileSize()
{
return qfileinfo.size();
}
QString FileInfo::fileCreateTime()
{
return qfileinfo.birthTime().toString();
}
QString FileInfo::fileUpdateTime()
{
return qfileinfo.metadataChangeTime().toString();
}
QString FileInfo::fileProperty()
{
return qfileinfo.symLinkTarget();
}
QString FileInfo::fileAll()
{
return qfileinfo.group();
}
QString FileInfo::fileComputer()
{
qfileinfo.bundleName();
}
filereadthread.h
#ifndef FILEREADTHREAD_H
#define FILEREADTHREAD_H
#include <QFileInfo>
#include <QObject>
#include<QThread>
class FileReadThread : public QObject
{
Q_OBJECT
public:
explicit FileReadThread(QObject *parent = nullptr);
FileReadThread(QString path);
QString getFilePath();
signals:
void lineText(QString text); //一次发送一行文本
void errorInfo(QString error); //发送错误信息到状态栏
void lineCount(int count); //实时发送行的数量
public slots:
void readFile(); //读取文件
private:
QString PATH;
};
#endif // FILEREADTHREAD_H
filereadthread.cpp文章来源:https://www.toymoban.com/news/detail-429702.html
#include "filereadthread.h"
FileReadThread::FileReadThread(QObject *parent)
: QObject{parent}
{
}
FileReadThread::FileReadThread(QString path)
{
this->PATH=path;
}
//获取文件路径
QString FileReadThread::getFilePath()
{
return PATH;
}
//读取文件
void FileReadThread::readFile()
{
static qint32 count=0;
//如果不是文件则直接结束函数
if(getFilePath().isEmpty()){
emit errorInfo("路径为空,结束运行");
return ;
}
//开始循环读取文件,然后逐行发送至接收方
QFile f(PATH);
f.open(QIODevice::ReadOnly|QIODevice::Text);
while (!f.atEnd()) {
emit lineText(f.readLine());
emit lineCount(count);
count++;
QThread::msleep(1);
}
//读取文件完成后,发送读取完成标志信号
if(f.atEnd()) emit lineCount(count);
f.close();
}
clone地址: git@gitcode.net:XiaoWang_csdn/q__bigfilemultithreadread_gui.git文章来源地址https://www.toymoban.com/news/detail-429702.html
到了这里,关于Qt多线程读写大型文本文件项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!