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_DEBUGqDebug() << "文件内容 = " << writeStr;
#endif// 文件打开了,现在关闭QTextStream outFile(fileReadWrite);outFile << writeStr << endl;outFile.flush();