我的Qt学习之路——文本文件的读取与写入

为了能较好应用文件的读取与写入,我编写了一个简易的文本编辑器


首先,先编写新建功能:

先在mainwindow.h里添加新建功能槽函数的声明:

private slots:
    void newFileSlots();

然后在mainwindow.cpp中给出它的定义:

void MainWindow::newFileSlots(){
    if(ui->textEdit->document()->isModified()){ //判断textedit里是否有改动
        if(saveFileName.isEmpty())
            this->saveAsFileSlots();   //如果有改动,且文件路径为空,调用另存为槽函数
        else
            this->saveFileSlots();     //否则调用保存函数
        if(saveFileName.isEmpty())
            return;
        ui->textEdit->clear();     //将textedit清空
    }
    else{
        ui->textEdit->clear();     //若没有改动,直接清空
    }
}


然后是打开功能:

在mainwindow.h中给出打开功能的声明,而且在这里我还设置了一个私有成员变量saveFileName,用于存储文件名及其路径。

private:
    QString saveFileName;
private slots:
    void openFileSlots();

打开功能槽函数定义:

void MainWindow::openFileSlots(){
    /*调用QFileDialog框,就是我们平时文件菜单下点击打开后弹出的对话框,获取所输入的文件路径,"open file"是对话框标题,QDir::currentPath是框弹出时默认为当前路径*/
    saveFileName=QFileDialog::getOpenFileName(this,"Open File",QDir::currentPath());
    QFile *file=new QFile;   //申请一个文件指针
    file->setFileName(saveFileName);   //设置文件路径
    bool ok=file->open(QIODevice::ReadOnly);    //布尔型变量ok表示文件以只读方式是否打开成功

    if(ok){
        QTextStream in(file);   //创建QTextStream流操作对象,使之与file绑定
        ui->textEdit->setText(in.readAll());   //将file中数据全部读取,并打印到textedit框中
        file->close();
        delete file;
    }
}



保存功能:

声明函数同上,下面是cpp文件中该函数的定义:

void MainWindow::saveFileSlots(){
    if(saveFileName.isEmpty()){    //若saveFileName为空,则说明该文件是新建文件,需执行另存为操作
        this->saveAsFileSlots();
    }
    else{
        QFile *file=new QFile;
        file->setFileName(saveFileName);
        bool ok=file->open(QIODevice::WriteOnly);

        if(ok){
            QTextStream out(file);
            out<textEdit->toPlainText();    //将textedit文本框中的纯文本输出到file中
            file->close();
            delete file;
        }
    }
}

另存为功能:

另存为功能在cpp文件中的定义:

void MainWindow::saveAsFileSlots(){
    /*为了防止另存为对话框弹出后关闭导致saveFileName被赋空值,先用一个temp保存一下并进行判断*/
    QString tempsaveFileName=QFileDialog::getSaveFileName(this,"Save As File",QDir::currentPath());
    if(tempsaveFileName.isEmpty()){    //若为空,则说明没有保存上,弹出错误信息
        QMessageBox::information(this,"哎呀,发生了一个小错误","保存失败");
        return;
     }
    saveFileName=tempsaveFileName;

    QFile *file=new QFile;
    file->setFileName(saveFileName);
    bool ok=file->open(QIODevice::WriteOnly);

    if(ok){
        QTextStream out(file);
        out<textEdit->toPlainText();
        file->close();
        delete file;
    }
}


有时候我们没有保存就点了关闭,这时候需要通过closeevent函数对关闭窗口消息进行接纳或忽略:

void MainWindow::closeEvent(QCloseEvent *event){
    if(ui->textEdit->document()->isModified()){
        this->saveFileSlots();
        if(saveFileName.isEmpty()){
            event->ignore();
        }
        event->accept();
    }
    else{
        event->accept();
    }
}

好了,最后一步,利用connect函数把发出的信号与槽函数连接起来:

    QObject::connect(ui->newAction,SIGNAL(triggered(bool)),this,SLOT(newFileSlots()));
    QObject::connect(ui->openAction,SIGNAL(triggered(bool)),this,SLOT(openFileSlots()));
    QObject::connect(ui->saveAction,SIGNAL(triggered(bool)),this,SLOT(saveFileSlots()));
    QObject::connect(ui->saveasAction,SIGNAL(triggered(bool)),this,SLOT(saveAsFileSlots()));






你可能感兴趣的:(Qt)