目的:这个例子,仿照windows记事本写一个小程序。
Ui如下:
-
设计打开文档功能:
void MainWindow::openFileSlot() { QString fileName = QFileDialog::getOpenFileName(this,"打开文件",QDir::currentPath()); //利用QFileDialog的静态函数,打开一个对话框,并获取到文件名 if(fileName.isEmpty())//如果getOpenFileName返回null { QMessageBox::warning(this,"提示","您并没有打开任何文档"); return; } QFile *file = new QFile; file->setFileName(fileName);//设置文件名称 bool ok = file->open(QIODevice::ReadOnly);//用只读方式打开文件,也可以用下面这样的写法 /* if(!file->open(QIODevice::ReadOnly)) { QMessageBox::information(this,"提示","您打开的文件不存在"); return; } */ if(ok) { //文件与文本流相关联 QTextStream in(file); //in.readAll();//将所有的字符串读取出来 ui->textEdit->setText(in.readAll()); } else { QMessageBox::warning(this,"提示","没有打开的权限"+file->errorString()); //提示出错信息 return; } file->close(); delete file; }
注意:这里必须关闭文档,并且删除指针。不然会出现野指针的情况。
-
设计另存为文档功能
void MainWindow::saveAsFileSlot() { QString saveFileName = QFileDialog::getSaveFileName(this,"保存文件",QDir::currentPath()); //获取当前路径的文档窗口,并获取输入要保存文件的名字 if(saveFileName.isEmpty()) { QMessageBox::warning(this,"提示","您没有输入文件名称"); return; } QFile *file = new QFile; file->setFileName(saveFileName); bool ok = file->open(QIODevice::WriteOnly); if(ok) { QTextStream out(file); out<<ui->textEdit->toPlainText();//提取textEdit中的纯文本,写入文件 } else { QMessageBox::warning(this,"提示","打开文件错误"); } file->close(); delete file; }
这里用到了textEdit的toPlainText()方法,在Qt帮助文档中的解释如下:
This property gets and sets the text editor’s contents as plain text.
翻译为:这个属性获取和设置编辑器的内容为纯文本。
同时这里用到了QTextStream类,可以参考:Qt QDataStream类
如果需要实现在打开文档的时候,就有一个默认的保存文件名的话,可以通过以为实现方法:
saveFileName = QFileDialog::getSaveFileName(this,"保存文件","./未命名.txt",tr("Text (*.txt)"));
-
设计保存文档功能
void MainWindow::saveFileSlot() { if(saveFileName.isEmpty())//如果这个文档没有被保存过 { this->saveAsFileSlot(); } else { QFile *file = new QFile; file->setFileName(saveFileName); bool ok = file->open(QIODevice::WriteOnly); if(ok) { QTextStream out(file); out<<ui->textEdit->toPlainText(); return; } file->close(); this->setWindowTitle(saveFileName);//设置这个程序的标题 delete file; } }
在这个程序中saveFileName是全局变量。
-
设计新建文档操作
void MainWindow::newFileSlot() { if(ui->textEdit->document()->isModified()) { QMessageBox::information(this,"提示","文档已经被修改"); this->saveFileSlot(); //如果当前的文档已经被修改了,就实现保存文档操作。 } else { ui->textEdit->clear(); this->setWindowTitle("新建文件.txt"); } }