qt5之QFile读写文件功能详解

 更新时间:2022年05月09日 15:03:41   作者:PandaMohist  
这篇文章主要为大家详细介绍了qt5之QFile读写文件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了qt5之QFile读写文件功能的具体代码,供大家参考,具体内容如下

1、效果

读写文件用到的是QFile类,

这里,我显示文件内容用到的是 QTextEdit

2、创建打开和关闭按钮

// 打开文件
    btnOpenFile     = new QToolButton;
    btnOpenFile->setText(tr("open a file"));
    btnOpenFile->setToolTip(tr("open a file"));
    connect(btnOpenFile, SIGNAL(clicked(bool)), this, SLOT(btnOpenFileSlot()));
    btnOpenFile->setIcon(QIcon(":/res/ico/dev/open"));
    btnOpenFile->setFixedSize(80, 48);
    btnOpenFile->setIconSize(QSize(80, 48));
 
    // 关闭文件
    btnCloseFile    = new QToolButton;
    btnCloseFile->setText(tr("close file"));
    btnCloseFile->setToolTip(tr("close file"));
    connect(btnCloseFile, SIGNAL(clicked(bool)), this, SLOT(btnCloseFileSlot()));
    btnCloseFile->setIcon(QIcon(":/res/ico/dev/save"));
    btnCloseFile->setFixedSize(80, 48);
    btnCloseFile->setIconSize(QSize(80, 48));

3、打开文件

 /*
       getOpenFileName函数说明
       函数原形: QStringList QFileDialog::getOpenFileNames(
       QWidget * parent = 0,
       const QString & caption = QString(),    //  打开文件对话框的标题
       const QString & dir = QString(),            //  查找目录
       const QString & filter = QString(),     //  设置需要过滤的文件格式
       QString * selectedFilter = 0,
       Options options = 0) [static]
       */
       //---获取文件名;
    QString qexeFullPath    = QDir::currentPath();
    QString fileName        = QFileDialog :: getOpenFileName(this, tr("选择一个文件"), qexeFullPath, "*.txt");
 
    // 1、若没有选择文件
    if (true                == fileName.isEmpty())
    {
        // 什么也不做
        return;
    }
 
    // 2、选择了文件,打开新选择的文件前,检查先前的文件
    CheckFileClose();
 
    // 3、 打开文件,显示文件内容
    GetFileContext(fileName);

CheckFileClose函数:

// 1、若已经打开文件,且文件内容发生变化,此时又打开文件,则提示是否保存先前的文件
    bool fileIsOpen         = fileReadWrite->isOpen();
    // 1.1 若打开了, 没有关闭
    if (true                == fileIsOpen)
    {
        // 1.1.1 若文件内容发生变化
        bool isChanged      = GetTextEditContentIsChanged();
        if (true            == isChanged)
        {
            int  okcancel   = QMessageBox::information(this, tr("mention"), tr("dev tab, textEdit's content has changed, do U wanna save ?"), QMessageBox::Ok | QMessageBox::Cancel);
 
            // 点击了是,则需要保存文件
            if (QMessageBox::Ok == okcancel)
            {
                SaveFile();
            }
 
            // 点击了否,什么也不做
            else
            {
 
            }
        }
 
        // 1.1.2 文件内容没有变化
        else
        {
            // 什么也不做
        }
 
        // 1.1.3 关闭文件
        fileReadWrite->close();
 
        // 1.1.4 清空显示内容
        textEditShowFile->clear();
 
        // 1.1.5 设置为只读
        textEditShowFile->setReadOnly(true);
 
        // 1.1.6 清空文件内容缓冲区
        textEditContent = QString("");
 
        // 1.1.6 清除文件名
        lineEditFileName->setText("");
    }
    // 1.2文件没有打开
    else
    {
        // 文件没有打开,什么也不做
 
    }

GetFileContext函数代码:

// 之前已经保证文件关闭了,现在重新打开文件
 
    // 2、 打开文件
    fileReadWrite->setFileName(openNewFileName);
    bool openFlag           = fileReadWrite->open(QIODevice ::ReadWrite | QIODevice ::Text);
    // 若打开失败
    if (false               == openFlag)
    {
        QMessageBox::critical(this, tr("warning"),  tr("open file err"));
        return;
    }
 
    // 保存文件名
    openFileName            = openNewFileName;
 
    // 3.1 删除原有的内容
    textEditShowFile->clear();
 
    // 3.2 显示文件内容
    QTextStream textStream(fileReadWrite);
    while (!textStream.atEnd())
    {
        //---QtextEdit按行显示文件内容
        textEditShowFile->append(textStream.readLine());
    }
 
    // 5、解除只读
    textEditShowFile->setReadOnly(false);
 
    // 6、临时保存当前打开文件内容
    textEditContent = textEditShowFile->toPlainText();
 
    // 7、显示打开的文件名
    lineEditFileName->setText(openFileName);

4、关闭按钮

下面做了关闭文件前的一些检查

// 1、若已经打开文件,且文件内容发生变化,此时又打开文件,则提示是否保存先前的文件
    bool fileIsOpen         = fileReadWrite->isOpen();
    // 1.1 若打开了, 没有关闭
    if (true                == fileIsOpen)
    {
        // 1.1.1 若文件内容发生变化
        bool isChanged      = GetTextEditContentIsChanged();
        if (true            == isChanged)
        {
            int  okcancel   = QMessageBox::information(this, tr("mention"), tr("dev tab, textEdit's content has changed, do U wanna save ?"), QMessageBox::Ok | QMessageBox::Cancel);
 
            // 点击了是,则需要保存文件
            if (QMessageBox::Ok == okcancel)
            {
                SaveFile();
            }
 
            // 点击了否,什么也不做
            else
            {
 
            }
        }
 
        // 1.1.2 文件内容没有变化
        else
        {
            // 什么也不做
        }
 
        // 1.1.3 关闭文件
        fileReadWrite->close();
 
        // 1.1.4 清空显示内容
        textEditShowFile->clear();
 
        // 1.1.5 设置为只读
        textEditShowFile->setReadOnly(true);
 
        // 1.1.6 清空文件内容缓冲区
        textEditContent = QString("");
 
        // 1.1.6 清除文件名
        lineEditFileName->setText("");
    }
    // 1.2文件没有打开
    else
    {
        // 文件没有打开,什么也不做
 
    }

其中,SaveFile函数代码如下:

 bool isOpen = fileReadWrite->isOpen();
    // 若文件没有打开
    if (false   == isOpen)
    {
        return;
    }
 
    // 关闭文件
    fileReadWrite->close();
 
    fileReadWrite->open(QIODevice ::WriteOnly | QIODevice ::Text | QIODevice::Truncate);
    QString writeStr    = textEditShowFile->toPlainText();
#ifdef QT_DEBUG
    qDebug() << "文件内容 = " << writeStr;
#endif
 
    // 文件打开了,现在关闭
    QTextStream outFile(fileReadWrite);
    outFile << writeStr << endl;
    outFile.flush();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++ 二进制文件读写方式及示例详解

    C++ 二进制文件读写方式及示例详解

    这篇文章主要为大家介绍了C++ 二进制文件读写实现方式及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 深入VC回调函数的使用详解

    深入VC回调函数的使用详解

    本篇文章是对VC回调函数的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • VSCode配置C++环境的方法步骤(MSVC)

    VSCode配置C++环境的方法步骤(MSVC)

    这篇文章主要介绍了VSCode配置C++环境的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • C++事件驱动型银行排队模拟

    C++事件驱动型银行排队模拟

    这篇文章主要为大家详细介绍了C++事件驱动型银行排队模拟,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 一文读懂C++中Protobuf

    一文读懂C++中Protobuf

    Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化、或者说序列化,本文详解了Protobuf的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-05-05
  • C语言实现扫雷游戏(可以自动展开)

    C语言实现扫雷游戏(可以自动展开)

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏,可以自动展开,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C语言运算符与表达式

    C语言运算符与表达式

    这篇文章主要介绍了C语言运算符与表达式,表达式是C语言的主体。在C语言中,表达式由操作符和操作数组成,更多相关介绍需要的小伙伴可以参考下面文章内容
    2022-07-07
  • C语言实现简单的三子棋

    C语言实现简单的三子棋

    这篇文章主要为大家详细介绍了C语言实现简单的三子棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 详解MFC/C++调用易语言的整数型和文本型与VS2010互动

    详解MFC/C++调用易语言的整数型和文本型与VS2010互动

    在本篇文章里我们给大家分享了MFC/C++调用易语言的整数型和文本型与VS2010互动相关知识点内容,有兴趣的朋友们可以参考下。
    2018-11-11
  • C语言字符函数、内存函数功能及实现代码

    C语言字符函数、内存函数功能及实现代码

    这篇文章主要介绍了C语言字符函数、内存函数 功能及实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02

最新评论