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

这篇具有很好参考价值的文章主要介绍了Qt多线程读写大型文本文件项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一 功能列表

二 架构设计

三 代码实现

四 软件原型效果

五 测试验证

六 项目工程打包发布

七 项目完整源码获取


一 功能列表

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

二 架构设计

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

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

三 代码实现

类名

作用

main.cpp

程序入口类

mainwindow.h

mainwindow.cpp

负责界面交互逻辑处理、数据显示

fileinfo.h

fileinfo.cpp

获取文件信息

filereadthread.h filereadthread.cpp

文件读取线程

writefilethread.h writefilethread.cpp

文件写入线程

四 软件原型效果

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

五 测试验证

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

六 项目工程打包发布

完整程序下载地址: 下载后可直接运行,已经打包为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文章来源地址https://www.toymoban.com/news/detail-429702.html

到了这里,关于Qt多线程读写大型文本文件项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flutter:文件系统目录、文件读写

    参考:老孟 文件存储和网络请求 Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart IO 库来操作文件的。但是不同的平台对应的文件系统是不同的,比如文件路径,因此通常使用Google 官方

    2024年02月09日
    浏览(49)
  • 【c语言】文本文件的读写操作

    创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡𖥦)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c语言系列专栏:c语言之路重点知识整合 🔥 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ 本文基

    2024年01月17日
    浏览(39)
  • Ueditor 百度强大富文本Springboot 项目集成使用(包含上传文件和上传图片的功能使用)简单易懂,举一反三

    首先如果大家的富文本中不考虑图片或者附件的情况下,只考虑纯文本且排版的情况下我们可以直接让前端的vue来继承UEditor就可以啦。但是要让前端将那几个上传图片和附件的哪些功能给阉割掉! 然后就是说如果考虑到了上传图片或者视频和附件那么咱们还是用的前后分离

    2024年02月15日
    浏览(49)
  • VBA下载二进制文件,文本读写

    这里使用了vba如下两个对象: Microsoft.XMLHTTP :文件读写,可读写二进制,可指定编码,对于utf-8编码文本文件使用FSO的TextStream对象打开,读取到的内容可能会出现乱码,可以使用该对象打开;前期绑定添加引用: Microsoft ActiveX Data Objects 2.8 Microsoft.XMLHTTP :发送请求并获得返回,

    2024年02月16日
    浏览(62)
  • 关于C#读写文本文件(.txt)的方法

    读写文本文件其实是件很简单的事情,本文主要给大家介绍了关于C#读写文本文件(.txt)的相关资料,需要的朋友可以参考下 读取txt文件 如果你要读取的文件内容不是很多,可以使用 File.ReadAllText(filePath) 或指定编码方式 File.ReadAllText(FilePath, Encoding)的方法。它们都一次性将文本内

    2024年02月15日
    浏览(39)
  • 3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java

    1、hadoop3.1.4简单介绍及部署、简单验证 2、HDFS操作 - shell客户端 3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java 4、HDFS-java操作类HDFSUtil及junit测试(HDFS的常见操作以及H

    2024年02月16日
    浏览(55)
  • Qt文件系统操作和文件的读写

    QIODevice:所有输入输出设备的基础类 QFile :用于文件操作和文件数据读写的类 QSaveFile :用于安全保存文件的类 QTemporaryFile :用于创建临时文件的类 QTcpSocket 和 QUdpSocket :分别实现了TCP和UDP的类 QSerialPort :实现串口通信的类 QBluetoothSocket :用于蓝牙通信的类 QProcess :用于启

    2024年02月12日
    浏览(48)
  • qt读写xml文件

    Qt使用XML模块,在.pro文件中添加 QT += xml Qt 提供了三种读 写  XML 文档的方法: QXmlStreamReader / QXmlStreamWriter: 一种快速的基于流的方式访问良格式 XML 文档 , 特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一

    2024年02月11日
    浏览(39)
  • Qt——文件的读写操作

    文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处理而开发的,所以文件读写是应用程序开发的一个基本功能。 Qt 提供了两种读写纯文本文件的基本方法: 用 QFile 类 的 IODevice 读写功能直接进行读写 利用 QFile 和 QTextStream 结合起来,

    2024年02月13日
    浏览(45)
  • C++/Qt 读写文件

    之前写过两篇跟文件操作相关的博客,有兴趣也可以看一下: C语言读写文件 Qt关于文件路径的处理 先讲一些关于基础文本文件和二进制文件的读写操作,后续将会整理C++/Qt关于ini、xml、json、xlsx相关文件的读写操作。 相比于C语言使用FILE文件指针来实现文件操作,C++ 采用的

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包