qt5之QFile讀寫檔案
阿新 • • 發佈:2019-01-30
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函式:
GetFileContext函式程式碼:// 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 { // 檔案沒有開啟,什麼也不做 }
// 之前已經保證檔案關閉了,現在重新開啟檔案
// 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();