跳转至

文件操作

打开文件


在 Qt 中可以调用如下界面打开文件, 其调用 QFileDialog 下的函数打开文件并且返回文件名。

其中,调用该窗口需要使用如下方法:

QFileDialog::getOpenFileName();

这个方法有四个参数

  • 该窗口的父类对象
  • 该窗口标题
  • 默认打开的文件目录
  • 过滤的文件类型

示例

判断是否打开文件
1
2
3
4
5
6
7
8
9
// fileName: getOpenFileName 返回打开文件的文件名, 如果未打开文件则返回结果为空
// QCoreApplication::applicationFilePath(): 这个方法可以返回程序执行目录 (当前目录)
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QCoreApplication::applicationFilePath(), "*.cpp");
// 判断字符串是否为空
// 判断是否打开了文件
if (fileName.isEmpty()){
    // 弹出警告框
    QMessageBox::warning(this, "WARNING", "Please select File");
}

当确定了需要打开的文件后, 即可对对应的文件进行操作。

QFile file;

保存文件


保存文件使用如下的方法:

QFileDialog::getSaveFileName();

该方法的使用与 QFileDialog::getOpenFileName(); 大致相同

示例

// 保存文件
void MainWindow::saveActionSlot(){
    QString fileName = QFileDialog::getSaveFileName(this, "选择保存位置", QCoreApplication::applicationFilePath());
    // 判断返回是否为空
    if (fileName.isEmpty()){
        QMessageBox::warning(this, "警告", "请选择一个文件");
    }else{
        QFile file(fileName);
        // 以只写的方式打开文件
        file.open(QIODevice::WriteOnly);
        // 读取文本框内容写入 ba 缓存
        QByteArray ba;
        ba.append(ui->textEdit->toPlainText());
        file.write(ba);
        file.close();
    }
}

示例代码


  • 文本编辑器
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QMessageBox>
#include <QDebug>

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 newActionSlot ();
    void openActionSlot ();
    void saveActionSlot ();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
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.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setWindowTitle("MASLiteEdit 文本编辑器 by JRNitre");

    // 连接 新建文件 命令至槽函数
    connect(ui->Newfile_Action, &QAction::triggered, this, &MainWindow::newActionSlot);
    // 连接 打开文件 命令至槽函数
    connect(ui->Open_Action, &QAction::triggered, this, &MainWindow::openActionSlot);
    // 连接 另存为 命令至槽函数
    connect(ui->Save_Action, &QAction::triggered, this, &MainWindow::saveActionSlot);
}

// 打开文件
void MainWindow::openActionSlot(){
    // 调用文件资源浏览器
    QString fileName = QFileDialog::getOpenFileName(this, tr("打开一个文件"), QCoreApplication::applicationFilePath(), "*.txt");

    // 判断字符串是否为空
    // 判断是否打开了文件
    if (fileName.isEmpty()){
        // 弹出警告框
        // QMessageBox::warning(this, "警告", "请打开文件");
        return;
    }
    else{
        // 构造文件对象
        QFile file(fileName);
        // 打开文件 (只读)
        file.open(QIODevice::ReadOnly);
        // 读取数据至 ba
        QByteArray ba = file.readAll();
        // 显示读取到的数据
        ui->textEdit->setText(QString(ba));
        // 将文件名显示至标题

        int index = fileName.lastIndexOf('/');
        this->setWindowTitle(fileName.mid(index + 1));
        // 关闭文件
        file.close();
    }
}

// 新建文本文档
void MainWindow::newActionSlot(){
    ui->textEdit->clear();
    this->setWindowTitle("New File.txt");
}

// 保存文件
void MainWindow::saveActionSlot(){
    QString fileName = QFileDialog::getSaveFileName(this, "选择保存位置", QCoreApplication::applicationFilePath());
    if (fileName.isEmpty()){
        QMessageBox::warning(this, "警告", "请选择一个文件");
    }else{
        QFile file(fileName);
        // 以只写的方式打开文件
        file.open(QIODevice::WriteOnly);
        // 读取文本框内容写入 ba 缓存
        QByteArray ba;
        ba.append(ui->textEdit->toPlainText());
        file.write(ba);
        file.close();
    }
}

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