1. 程式人生 > >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();