原创 六、Qt Creator实现文本编辑(原创)

2009-11-7 12:33 3100 2 2 分类: MCU/ 嵌入式

http://hi.baidu.com/yafeilinux/blog/item/b303c844e8db042ccefca322.html


查看原文。


前面已经将界面做好了,这里我们为其添加代码,实现文本编辑的功能。


首先实现新建文件,文件保存,和文件另存为的功能。


(我们先将上次的工程文件夹进行备份,然后再对其进行修改。在写较大的程序时,经常对源文件进行备份,是个很好的习惯。)


在开始正式写程序之前,我们先要考虑一下整个流程。因为我们要写记事本一样的软件,所以最好先打开windows中的记事本,进行一些简单的操作,然后考虑怎样去实现这些功能。再者,再强大的软件,它的功能也是一个一个加上去的,不要设想一下子写出所有的功能。我们这里先实现新建文件,保存文件,和文件另存为三个功能,是因为它们联系很紧,而且这三个功能总的代码量也不是很大。


因为三个功能之间的关系并不复杂,所以我们这里便不再画流程图,而只是简单描述一下。


新建文件,那么如果有正在编辑的文件,是否需要保存呢?


如果需要进行保存,那这个文件以前保存过吗?如果没有保存过,就应该先将其另存为。


下面开始按这些关系写程序。


1.打开Qt Creator,在File菜单中选择Open,然后在工程文件夹中打开MainWindow.pro工程文件。


先在main.cpp文件中加入以下语句,让程序中可以使用中文。


在其中加入#include <QTextCodec> 头文件包含,再在主函数中加入下面一行:


QTextCodec::setCodecForTr(QTextCodec::codecForLocale());


这样在程序中使用中文,便能在运行时显示出来了。更改后文件如下图。



2.在mainwindow.h文件中的private下加入以下语句。


bool isSaved; //为true时标志文件已经保存,为false时标志文件尚未保存


QString curFile; //保存当前文件的文件名



void do_file_New(); //新建文件


void do_file_SaveOrNot(); //修改过的文件是否保存


void do_file_Save(); //保存文件


void do_file_SaveAs(); //文件另存为


bool saveFile(const QString& fileName); //存储文件


这些是变量和函数的声明。其中isSaved变量起到标志的作用,用它来标志文件是否被保存过。然后我们再在相应的源文件里进行这些函数的定义。


3.在mainwindow.cpp中先加入头文件#include <QtGui>,然后在构造函数里添加以下几行代码。


isSaved = false; //初始化文件为未保存过状态


curFile = tr("未命名.txt"); //初始化文件名为“未命名.txt”


setWindowTitle(curFile); //初始化主窗口的标题


这是对主窗口进行初始化。效果如下。



4.然后添加“新建”操作的函数定义。


void MainWindow::do_file_New() //实现新建文件的功能


{


do_file_SaveOrNot();


isSaved = false;


curFile = tr("未命名.txt");


setWindowTitle(curFile);


ui->textEdit->clear(); //清空文本编辑器


ui->textEdit->setVisible(true); //文本编辑器可见


}



新建文件,先要判断正在编辑的文件是否需要保存。然后将新建的文件标志为未保存过状态。


5.再添加do_file_SaveOrNot函数的定义。


void MainWindow::do_file_SaveOrNot() //弹出是否保存文件对话框


{


if(ui->textEdit->document()->isModified()) //如果文件被更改过,弹出保存对话框


{


QMessageBox box;


box.setWindowTitle(tr("警告"));


box.setIcon(QMessageBox::Warning);


box.setText(curFile + tr(" 尚未保存,是否保存?"));


box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);


if(box.exec() == QMessageBox::Yes) //如果选择保存文件,则执行保存操作


do_file_Save();


}


}



这个函数实现弹出一个对话框,询问是否保存正在编辑的文件。





6.再添加“保存”操作的函数定义。



void MainWindow::do_file_Save() //保存文件


{


if(isSaved){ //如果文件已经被保存过,直接保存文件


saveFile(curFile);


}


else{


do_file_SaveAs(); //如果文件是第一次保存,那么调用另存为


}


}



对文件进行保存时,先判断其是否已经被保存过,如果没有被保存过,就要先对其进行另存为操作。



7.下面是“另存为”操作的函数定义。



void MainWindow::do_file_SaveAs() //文件另存为


{


QString fileName = QFileDialog::getSaveFileName(this,tr("另存为"),curFile);


//获得文件名


if(!fileName.isEmpty()) //如果文件名不为空,则保存文件内容


{


saveFile(fileName);


}


}



这里弹出一个文件对话框,显示文件另存为的路径。






8.下面是实际文件存储操作的函数定义。



bool MainWindow::saveFile(const QString& fileName)


//保存文件内容,因为可能保存失败,所以具有返回值,来表明是否保存成功


{


QFile file(fileName);


if(!file.open(QFile::WriteOnly | QFile::Text))


//以只写方式打开文件,如果打开失败则弹出提示框并返回


{


QMessageBox::warning(this,tr("保存文件"),


tr("无法保存文件 %1:\n %2").arg(fileName)


.arg(file.errorString()));


return false;


}


//%1,%2表示后面的两个arg参数的值


QTextStream out(&file);   //新建流对象,指向选定的文件


out << ui->textEdit->toPlainText();   //将文本编辑器里的内容以纯文本的形式输出到流对象中



isSaved = true;


curFile = QFileInfo(fileName).canonicalFilePath(); //获得文件的标准路径


setWindowTitle(curFile); //将窗口名称改为现在窗口的路径


return true;


}



这个函数实现将文本文件进行存储。下面我们对其中的一些代码进行讲解。


QFile file(fileName);一句,定义了一个QFile类的对象file,其中filename表明这个文件就是我们保存的的文件。然后我们就可以用file代替这个文件,来进行一些操作。Qt中文件的操作和C,C++很相似。对于QFile类对象怎么使用,我们可以查看帮助。


            点击Qt Creator最左侧的Help,在其中输入QFile,在搜索到的列表中选择QFile即可。这时在右侧会显示出QFile类中所有相关信息以及他们的用法和说明。





//


我们往下拉,会发现下面有关于怎么读取文件的示例代码。


//




//



再往下便能看到用QTextStream类对象,进行字符串输入的例子。下面也提到了QFileInfo和QDir等相关的类,我们可以点击它们去看一下具体的使用说明。


//


上面只是做了一个简单的说明。以后我们对自己不明白的类都可以去帮助里进行查找,这也许是我们以后要做的最多的一件事了。对于其中的英文解释,我们最好想办法弄明白它的大意,其实网上也有一些中文的翻译,但最好还是从一开始就尝试着看英文原版的帮助,这样以后才不会对中文翻译产生依赖。


       我们这次只是很简单的说明了一下怎样使用帮助文件,这不表明它不重要,而是因为这里不可能将每个类的帮助都解释一遍,没有那么多时间,也没有那么大的篇幅。而更重要的是因为,我们这个教程只是引你入门,所以很多东西需要自己去尝试。


       在以后的教程里,如果不是特殊情况,就不会再对其中的类进行详细解释,文章中的重点是对整个程序的描述,其中不明白的类,自己查看帮助。


j_0028.gif



9.双击mainwindow.ui文件,在图形界面窗口下面的Action Editor动作编辑器里,我们右击“新建”菜单一条,选择Go to slot,然后选择triggered(),进入其触发事件槽函数。





同理,进入其他两个菜单的槽函数,将相应的操作的函数写入槽函数中。如下。


void MainWindow::on_action_New_triggered() //信号和槽的关联


{


do_file_New();


}



void MainWindow::on_action_Save_triggered()


{


do_file_Save();


}



void MainWindow::on_action_SaveAs_triggered()


{


do_file_SaveAs();


}



最终的mainwindow.cpp文件如下。






最终的mainwindow.h文件如下。



这时点击运行,就能够实现新建文件,保存文件,文件另存为的功能了。
j_0023.gif
然后实现打开,关闭,退出,撤销,复制,剪切,粘贴的功能


先备份上次的工程文件,然后再将其打开。


1.先在mainwindow.h文件中加入函数的声明。


void do_file_Open(); //打开文件



bool do_file_Load(const QString& fileName); //读取文件




2.再在mainwindow.cpp文件中写函数的功能实现。


void MainWindow::do_file_Open()//打开文件


{


do_file_SaveOrNot();//是否需要保存现有文件


QString fileName = QFileDialog::getOpenFileName(this);


//获得要打开的文件的名字


if(!fileName.isEmpty())//如果文件名不为空


{


do_file_Load(fileName);


}


ui->textEdit->setVisible(true);//文本编辑器可见


}




j_0028.gif





bool MainWindow::do_file_Load(const QString& fileName) //读取文件


{


QFile file(fileName);


if(!file.open(QFile::ReadOnly | QFile::Text))


{


QMessageBox::warning(this,tr("读取文件"),tr("无法读取文件 %1:\n%2.").arg(fileName).arg(file.errorString()));


return false;      //如果打开文件失败,弹出对话框,并返回


}


QTextStream in(&file);


ui->textEdit->setText(in.readAll());      //将文件中的所有内容都写到文本编辑器中


curFile = QFileInfo(fileName).canonicalFilePath();


setWindowTitle(curFile);


return true;


}




上面的打开文件函数与文件另存为函数相似,读取文件的函数与文件存储函数相似。



3.然后按顺序加入更菜单的关联函数,如下。








void MainWindow::on_action_Open_triggered()   //打开操作


{


do_file_Open();


}


//




void MainWindow::on_action_Close_triggered() //关闭操作


{


do_file_SaveOrNot();


ui->textEdit->setVisible(false);


}


//




void MainWindow::on_action_Quit_triggered() //退出操作


{


on_action_Close_triggered();     //先执行关闭操作


qApp->quit();    //再退出系统,qApp是指向应用程序的全局指针


}


//




void MainWindow::on_action_Undo_triggered() //撤销操作


{


ui->textEdit->undo();


}


//




void MainWindow::on_action_Cut_triggered() //剪切操作


{


ui->textEdit->cut();


}


//




void MainWindow::on_action_Copy_triggered() //复制操作


{


ui->textEdit->copy();


}


//




void MainWindow::on_action_Past_triggered() //粘贴操作


{


ui->textEdit->paste();


}







因为复制,撤销,全选,粘贴,剪切等功能,是TextEdit默认就有的,所以我们只需调用一下相应函数就行。



到这里,除了查找和帮助两个菜单的功能没有加上以外,其他功能都已经实现了。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条