自学内容网 自学内容网

Qt之文件系统操作和读写

Qt creator 6.80   MinGw 64bit

文本文件是指以纯文本格式存储的文件,如cpp和hpp文件。XML文件和JSON文件也是文本文件,只是使用了特定的标记符号定义文本的含义,读取这种文本文件需要先对内容解析再显示。

 qt提供了两种读写文本文件的方法。

一种是QFile,另一种是QTextStream。

下面介绍这两种方法的使用。

软件界面设计如下

软件运行界面

程序结构如下

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.hpp和mainwindow.cpp代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actOpenFile_triggered();
    void on_actQFileSave_triggered();

    void on_actQSaveFileSave_triggered();

    void on_actOpenStream_triggered();

    void on_actQTextStreamSave_triggered();

private:
    QString getFileName(bool save=false);
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
/***********************************************mainwindow.cpp****************************/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDir>
#include<QFileDialog>
#include<QSaveFile>
#include<QException>
#include<QTextDocument>
#include<QTextBlock>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setCentralWidget(ui->tabWidget);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actOpenFile_triggered()
{

    QString aFileName;
    aFileName=getFileName(false);

    QFile aFile(aFileName);
    if(!aFile.exists())  return ;
    if(!aFile.open(QIODevice::ReadOnly|QIODevice::Text))
        return ;
    QByteArray allLines=aFile.readAll();
    QString text(allLines);
    ui->textEditDevice->setPlainText(text);
    aFile.close();
    ui->tabWidget->setCurrentIndex(0);
}

QString MainWindow::getFileName(bool save)
{
    QString curPath=QDir::currentPath();
    QString dlgTitle="打开一个文件";
    QString filter="程序文件(*.cpp *.h);;文本文件(*.txt);;所有文件(*.*)";
    QString aFileName;
    if(save)
        aFileName=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
    else
        aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
    if(aFileName.isEmpty()) return aFileName;
    QFileInfo fileInfo(aFileName);
    QDir::setCurrent(fileInfo.absoluteFilePath());

    return aFileName;
}
void MainWindow::on_actQFileSave_triggered()
{
    QString aFileName=getFileName(true);
    if(aFileName.isEmpty()) return;
    QFile aFile(aFileName);
    if(!aFile.open(QIODevice::WriteOnly|QIODevice::Text))
    {
        return ;
    }
    QString str=ui->textEditDevice->toPlainText();
    QByteArray strBytes=str.toUtf8();
    aFile.write(strBytes,strBytes.length());
    aFile.close();
    ui->tabWidget->setCurrentWidget(0);
}
void MainWindow::on_actQSaveFileSave_triggered()
{
    QString aFileName=getFileName(true);
    QSaveFile aFile(aFileName);
    if(!aFile.open(QIODevice::WriteOnly|QIODevice::Text))
    {
        return ;
    }
    aFile.setDirectWriteFallback(false);//使用临时文件
    try{
        QString str=ui->textEditDevice->toPlainText();
        QByteArray strBytes=str.toUtf8();
        aFile.write(strBytes,strBytes.length());
        aFile.commit();
        ui->tabWidget->setCurrentIndex(0);
    }
    catch (QException &e)
    {
        qDebug("保存文件过程发生错误");
        aFile.cancelWriting();
    }
}
void MainWindow::on_actOpenStream_triggered()
{
    QString aFileName=getFileName(false);
    QFile aFile(aFileName);

    if(!aFile.exists()) return ;
    if(!aFile.open(QIODevice::ReadOnly|QIODevice::Text))
        return ;
    QTextStream aStream(&aFile);
    aStream.setAutoDetectUnicode(true);
    QString str=aStream.readAll();
    ui->textEditStream->appendPlainText(str);
    aFile.close();
}
void MainWindow::on_actQTextStreamSave_triggered()
{
    QString aFileName=getFileName(true);
    QSaveFile aFile(aFileName);


    if(!aFile.open(QIODevice::WriteOnly|QIODevice::Text))
        return ;
    aFile.setDirectWriteFallback(false);
    try{

            QTextStream aStream(&aFile);
            aStream.setAutoDetectUnicode(true);   //写入临时文件
            QTextDocument *doc=ui->textEditStream->document();
            int cnt=ui->textEditStream->blockCount();
            for(int i=0;i<cnt;i++)
            {
                QTextBlock textLine=doc->findBlockByLineNumber(i);
                QString str=textLine.text();
                aStream<<str<<"\n";
            }
            aFile.commit();
    }
    catch(QException &e)
    {
        qDebug("保存文件过程发生错误");
        aFile.cancelWriting();

    }
}


原文地址:https://blog.csdn.net/suntingsheng123/article/details/145207893

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!