为了能较好应用文件的读取与写入,我编写了一个简易的文本编辑器
首先,先编写新建功能:
先在mainwindow.h里添加新建功能槽函数的声明:
private slots:
void newFileSlots();
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();
}
}
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()));