时间:2022-07-05 13:50:25 | 栏目:C代码 | 点击:次
本文实例为大家分享了qt5之QFile读写文件功能的具体代码,供大家参考,具体内容如下
读写文件用到的是QFile类,
这里,我显示文件内容用到的是 QTextEdit
// 打开文件 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));
/* 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);
下面做了关闭文件前的一些检查
// 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();