Qt多线程读写大型文本文件项目

目录

一 功能列表

二 架构设计

三 代码实现

四 软件原型效果

五 测试验证

六 项目工程打包发布

七 项目完整源码获取


一 功能列表

  1. 显示文件路径选择框,仅展示 .txt类型文件可选;
  2. 读取文本文件,显示到桌面控件中;
  3. 读取的文件使用多线程处理,不影响显示界面正常操作;
  4. 读取过来的文件如有修改,需要保存修改部分;
  5. 读、写文件需要显示处理进度;
  6. 增加一个列表,用于展示文本文件的类型、大小、行数等。

二 架构设计

如上图所示,一个源文件,使用两个线程来对文件进行读写操作,最后把对文件的读写结果显示到屏幕上面。

三 代码实现

类名

作用

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

#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

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值