《QT文本编辑器的开发.pptx》由会员分享,可在线阅读,更多相关《QT文本编辑器的开发.pptx(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、会计学1QT文本编辑器的开发文本编辑器的开发(kif)第一页,共24页。主要主要(zhyo)的任务的任务n n1、文本编辑器的开发:实现“新建文件”,“文件保存”,和“文件另存为”的功能(gngnng)n n2、文本编辑器的开发:打开,关闭,退出,撤销,复制,剪切,粘贴的功能(gngnng)n n2、文本编辑器的开发:实现文本查找第1页/共24页第二页,共24页。一、实现一、实现“新建文件新建文件”,“文件保存文件保存(bocn)”,和,和“文件另存为文件另存为”的功能的功能n n新建文件,那么如果有正在编辑的文件,是否需要保存(bocn)呢?n n如果需要进行保存(bocn),那这个文件以前
2、保存(bocn)过吗?如果没有保存(bocn)过,就应该先将其另存为。第2页/共24页第三页,共24页。1.1.打开打开打开打开(d(d ki)Qt Creator ki)Qt Creator,在,在,在,在FileFile菜单中选择菜单中选择菜单中选择菜单中选择OpenOpen,然后在工程文件夹中打开,然后在工程文件夹中打开,然后在工程文件夹中打开,然后在工程文件夹中打开(d(d ki)MainWindow.pro ki)MainWindow.pro工程文件。工程文件。工程文件。工程文件。先在先在main.cpp文件中加入以下文件中加入以下(yxi)语句,让程序中可以使用语句,让程序中可以使
3、用中文。中文。#include QTextCodec:setCodecForTr(QTextCodec:codecForLocale();第3页/共24页第四页,共24页。2.在在mainwindow.h文件文件(wnjin)中的中的private下加下加入以下语句。入以下语句。bool isSaved;/为true时标志文件已经保存(bocn),为false时标志文件尚未保存(bocn)QString curFile;/保存(bocn)当前文件的文件名 void do_file_New();/新建文件 void do_file_SaveOrNot();/修改过的文件是否保存(bocn)voi
4、d do_file_Save();/保存(bocn)文件 void do_file_SaveAs();/文件另存为 bool saveFile(const QString&fileName);/存储文件 第4页/共24页第五页,共24页。3.3.在在在在mainwindow.cppmainwindow.cpp中先加入中先加入中先加入中先加入(jir)(jir)头文件头文件头文件头文件#include#include,然后在构造函数里添加以下几行代码。然后在构造函数里添加以下几行代码。然后在构造函数里添加以下几行代码。然后在构造函数里添加以下几行代码。isSaved=false;/初始化文件为未
5、保存过状态(zhungti)curFile=tr(“未命名.txt”);/初始化文件名为“未命名.txt”setWindowTitle(curFile);/初始化主窗口的标题 第5页/共24页第六页,共24页。4.然后添加然后添加(tin ji)“新建新建”操作的函数定义。操作的函数定义。n nvoid MainWindow:do_file_New()/void MainWindow:do_file_New()/实现新建文件的功能实现新建文件的功能 n n n ndo_file_SaveOrNot();do_file_SaveOrNot();n nisSaved=false;isSaved=f
6、alse;n ncurFile=tr(“curFile=tr(“未命名未命名.txt”);.txt”);n nsetWindowTitle(curFile);setWindowTitle(curFile);n nui-textEdit-clear();/ui-textEdit-clear();/清空清空(qn(qn kn kn)文本编辑器文本编辑器 n nui-textEdit-setVisible(true);/ui-textEdit-setVisible(true);/文本编辑器可见文本编辑器可见 n n 第6页/共24页第七页,共24页。5.再添加再添加(tin ji)do_file_S
7、aveOrNot函函数的定义。数的定义。n nvoid MainWindow:do_file_SaveOrNot()/void MainWindow:do_file_SaveOrNot()/弹出是否保存文件对话框弹出是否保存文件对话框 n n n nif(ui-textEdit-document()-isModified()/if(ui-textEdit-document()-isModified()/如果如果(rgu(rgu)文件被更改过,弹出保存对话框文件被更改过,弹出保存对话框 n n n nQMessageBox box;QMessageBox box;n nbox.setWindow
8、Title(tr(“box.setWindowTitle(tr(“警告警告”);”);n nbox.setIcon(QMessageBox:Warning);box.setIcon(QMessageBox:Warning);n nbox.setText(curFile+tr(”box.setText(curFile+tr(”尚未保存,是否保存?尚未保存,是否保存?”);”);n nbox.setStandardButtons(QMessageBox:Yes|QMessageBox:No);box.setStandardButtons(QMessageBox:Yes|QMessageBox:No
9、);n nif(box.exec()=QMessageBox:Yes)/if(box.exec()=QMessageBox:Yes)/如果如果(rgu(rgu)选择保存文件,则执行保存操选择保存文件,则执行保存操作作 n ndo_file_Save();do_file_Save();n n n n 第7页/共24页第八页,共24页。6.再添加再添加“保存保存”操作操作(cozu)的的函数定义。函数定义。n nvoid MainWindow:do_file_Save()/void MainWindow:do_file_Save()/保存文件保存文件 n n n nif(isSaved)/if(i
10、sSaved)/如果文件已经如果文件已经(y(y jing)jing)被保存过,直接保存文件被保存过,直接保存文件 n nsaveFile(curFile);saveFile(curFile);n n n nelseelsen ndo_file_SaveAs();/do_file_SaveAs();/如果文件是第一次保存,那么调用另存为如果文件是第一次保存,那么调用另存为 n n n n 第8页/共24页第九页,共24页。7.下面下面(xi mian)是是“另存另存为为”操作的函数定义。操作的函数定义。n nvoid MainWindow:do_file_SaveAs()/void MainW
11、indow:do_file_SaveAs()/文件另存为文件另存为 n n n nQString fileName=QFileDialog:getSaveFileName(this,tr(“QString fileName=QFileDialog:getSaveFileName(this,tr(“另存为另存为”),curFile);”),curFile);n n/获得文件名获得文件名 n nif(!fileName.isEmpty()/if(!fileName.isEmpty()/如果如果(rgu(rgu)文件名不为空,则保存文件内容文件名不为空,则保存文件内容 n n n nsaveFile
12、(fileName);saveFile(fileName);n n n n 第9页/共24页第十页,共24页。8.下面是实际文件存储操作下面是实际文件存储操作(cozu)的函数的函数定义。定义。n nbool MainWindow:saveFile(const QString&fileName)bool MainWindow:saveFile(const QString&fileName)n n/保存文件内容,因为可能保存失败,所以具有返回值,来表明是否保存成功保存文件内容,因为可能保存失败,所以具有返回值,来表明是否保存成功 n n n nQFile file(fileName);QFile
13、 file(fileName);n nif(!file.open(QFile:WriteOnly|QFile:Text)if(!file.open(QFile:WriteOnly|QFile:Text)n n/以只写方式打开文件,如果打开失败则弹出提示框并返回以只写方式打开文件,如果打开失败则弹出提示框并返回 n n n nQMessageBox:warning(this,tr(“QMessageBox:warning(this,tr(“保存文件保存文件”),”),n ntr(“tr(“无法保存文件无法保存文件%1:n%2).arg(fileName).arg(file.errorString
14、();%1:n%2).arg(fileName).arg(file.errorString();n nreturn false;return false;n n n n/%1,%2/%1,%2表示后面的两个表示后面的两个argarg参数的值参数的值 n nQTextStream out(&file);/QTextStream out(&file);/新建流对象,指向选定的文件新建流对象,指向选定的文件 n nout textEdit-toPlainText();/out textEdit-toPlainText();/将文本编辑器里的内容以纯文本的形式输出将文本编辑器里的内容以纯文本的形式输出
15、(shch)(shch)到流对象中到流对象中 n nisSaved=true;isSaved=true;n ncurFile=QFileInfo(fileName).canonicalFilePath();/curFile=QFileInfo(fileName).canonicalFilePath();/获得文件的标准路径获得文件的标准路径 n nsetWindowTitle(curFile);/setWindowTitle(curFile);/将窗口名称改为现在窗口的路径将窗口名称改为现在窗口的路径 n nreturn true;return true;n n 第10页/共24页第十一页,共
16、24页。9.双击双击mainwindow.ui文件,在图文件,在图形界面窗口下面的形界面窗口下面的Action Editor动作编辑器里,我们右击动作编辑器里,我们右击“新建新建”菜单一条,选择菜单一条,选择Go to slot,然后,然后选择选择triggered(),进入其触发(),进入其触发事件事件(shjin)槽函数。槽函数。第11页/共24页第十二页,共24页。同理,进入其他两个菜单的槽函数,将相应同理,进入其他两个菜单的槽函数,将相应同理,进入其他两个菜单的槽函数,将相应同理,进入其他两个菜单的槽函数,将相应(xingyng)(xingyng)的操作的函数写的操作的函数写的操作的函
17、数写的操作的函数写入槽函数中。如下。入槽函数中。如下。入槽函数中。如下。入槽函数中。如下。n nvoid MainWindow:on_action_New_triggered()/信号(xnho)和槽的关联n nn ndo_file_New();n nn nvoid MainWindow:on_action_Save_triggered()n nn ndo_file_Save();n nn nvoid MainWindow:on_action_SaveAs_triggered()n nn ndo_file_SaveAs();n n 第12页/共24页第十三页,共24页。二、打开,关闭,退出二、
18、打开,关闭,退出二、打开,关闭,退出二、打开,关闭,退出(tuch)(tuch),撤销,复制,撤销,复制,撤销,复制,撤销,复制,剪切,粘贴的功能剪切,粘贴的功能剪切,粘贴的功能剪切,粘贴的功能 n n1.先在先在mainwindow.h文件中加入文件中加入函数的声明函数的声明(shngmng)。n nvoid do_file_Open();/打开文件打开文件n nbool do_file_Load(const QString&fileName);/读取文件读取文件 第13页/共24页第十四页,共24页。2.再在再在mainwindow.cpp文件文件(wnjin)中写函数的功能实现。中写函数
19、的功能实现。n nvoid MainWindow:do_file_Open()/void MainWindow:do_file_Open()/打开文件打开文件 n n n ndo_file_SaveOrNot();/do_file_SaveOrNot();/是否需要保存现有是否需要保存现有(xin y(xin y u)u)文件文件 n nQString fileName=QFileDialog:getOpenFileName(this);QString fileName=QFileDialog:getOpenFileName(this);n n/获得要打开的文件的名字获得要打开的文件的名字 n
20、 nif(!fileName.isEmpty()/if(!fileName.isEmpty()/如果文件名不为空如果文件名不为空 n n n ndo_file_Load(fileName);do_file_Load(fileName);n n n nui-textEdit-setVisible(true);/ui-textEdit-setVisible(true);/文本编辑器可见文本编辑器可见 n n 第14页/共24页第十五页,共24页。n nbool MainWindow:do_file_Load(const QString&fileName)/读取文件n nn nQFile file(
21、fileName);n nif(!file.open(QFile:ReadOnly|QFile:Text)n nn nQMessageBox:warning(this,tr(“读取文件”),tr(“无法读取文件%1:n%2.”).arg(fileName).arg(file.errorString();n nreturn false;/如果打开文件失败,弹出对话框,并返回(fnhu)n nn nQTextStream in(&file);n nui-textEdit-setText(in.readAll();/将文件中的所有内容都写到文本编辑器中n ncurFile=QFileInfo(fil
22、eName).canonicalFilePath();n nsetWindowTitle(curFile);n nreturn true;n n 第15页/共24页第十六页,共24页。3.3.然后按顺序加入更菜单然后按顺序加入更菜单然后按顺序加入更菜单然后按顺序加入更菜单(ci dn)(ci dn)的关联函数,如下的关联函数,如下的关联函数,如下的关联函数,如下 n nvoid MainWindow:on_action_Open_triggered()/void MainWindow:on_action_Open_triggered()/打开操作打开操作(cozu)(cozu)n n n nd
23、o_file_Open();do_file_Open();n n n n/n nvoid MainWindow:on_action_Close_triggered()/void MainWindow:on_action_Close_triggered()/关闭操作关闭操作(cozu)(cozu)n n n ndo_file_SaveOrNot();do_file_SaveOrNot();n nui-textEdit-setVisible(false);ui-textEdit-setVisible(false);n n n n/n nvoid MainWindow:on_action_Quit_
24、triggered()/void MainWindow:on_action_Quit_triggered()/退出操作退出操作(cozu)(cozu)n n n non_action_Close_triggered();/on_action_Close_triggered();/先执行关闭操作先执行关闭操作(cozu)(cozu)n nqApp-quit();/qApp-quit();/再退出系统,再退出系统,qAppqApp是指向应用程序的全局指针是指向应用程序的全局指针 n n n n/第16页/共24页第十七页,共24页。n nvoid MainWindow:on_action_Undo
25、_triggered()/void MainWindow:on_action_Undo_triggered()/撤销撤销(chxio)(chxio)操作操作 n n n nui-textEdit-undo();ui-textEdit-undo();n n n n/n nvoid MainWindow:on_action_Cut_triggered()/void MainWindow:on_action_Cut_triggered()/剪切操作剪切操作 n n n nui-textEdit-cut();ui-textEdit-cut();n n n n/n nvoid MainWindow:on
26、_action_Copy_triggered()/void MainWindow:on_action_Copy_triggered()/复制操作复制操作 n n n nui-textEdit-copy();ui-textEdit-copy();n n n n/n nvoid MainWindow:on_action_Past_triggered()/void MainWindow:on_action_Past_triggered()/粘贴操作粘贴操作 n n n nui-textEdit-paste();ui-textEdit-paste();n n 第17页/共24页第十八页,共24页。下面
27、我们将进入一个下面我们将进入一个下面我们将进入一个下面我们将进入一个(y(y )文本编辑器的查找功能文本编辑器的查找功能文本编辑器的查找功能文本编辑器的查找功能n n思考:如何(rh)实现文本编辑器的查找功能?第18页/共24页第十九页,共24页。三、文本三、文本(wnbn)查找查找n n1.首先还是保存以前的工程,然后再将其打首先还是保存以前的工程,然后再将其打开开(d ki)。n n我们发现我们发现Qt Creator默认的字体有点小,可默认的字体有点小,可以按下以按下Ctrl键的同时按两下键的同时按两下+键,来放大字键,来放大字体。也可以选择体。也可以选择Edit-Advanced-In
28、crease Font Size。第19页/共24页第二十页,共24页。2.2.在在在在mainwindow.hmainwindow.h中加入中加入中加入中加入(jir)#include(jir)#include 的头文的头文的头文的头文件包含件包含件包含件包含n n1)在)在private中添加中添加n nQLineEdit*find_textLineEdit;/声明一个声明一个行编辑器,用于输入要查找行编辑器,用于输入要查找(ch zho)的内的内容容n n2)在)在private slots中添加中添加n nvoid show_findText();n n在该函数中实现查找在该函数中实现
29、查找(ch zho)字符串的功字符串的功能。能。第20页/共24页第二十一页,共24页。3.3.我们我们我们我们(w(w men)men)进入查找菜单的触发事件槽函数,更改如下。进入查找菜单的触发事件槽函数,更改如下。进入查找菜单的触发事件槽函数,更改如下。进入查找菜单的触发事件槽函数,更改如下。n nvoid MainWindow:on_action_Find_triggered()void MainWindow:on_action_Find_triggered()n n n nQDialog*findDlg=new QDialog(this);/QDialog*findDlg=new QD
30、ialog(this);/新建一个对话框,用于查找操作,新建一个对话框,用于查找操作,thisthis表明它的父窗口是表明它的父窗口是MainWindowMainWindow。n nfindDlg-setWindowTitle(tr(“findDlg-setWindowTitle(tr(“查找查找”);/”);/设置对话框的标题设置对话框的标题(biot)(biot)n nfind_textLineEdit=new QLineEdit(findDlg);/find_textLineEdit=new QLineEdit(findDlg);/将行编辑器加入到新建的查找对话框中将行编辑器加入到新建的
31、查找对话框中n nQPushButton*find_Btn=new QPushButton(tr(“QPushButton*find_Btn=new QPushButton(tr(“查找下一个查找下一个”),findDlg);/”),findDlg);/加入一个加入一个“查找下一个查找下一个”的按钮的按钮n nQVBoxLayout*layout=new QVBoxLayout(findDlg);QVBoxLayout*layout=new QVBoxLayout(findDlg);n nlayout-addWidget(find_textLineEdit);layout-addWidget(
32、find_textLineEdit);n nlayout-addWidget(find_Btn);/layout-addWidget(find_Btn);/新建一个垂直布局管理器,并将行编辑器和按钮加入其中新建一个垂直布局管理器,并将行编辑器和按钮加入其中n nfindDlg-show();/findDlg-show();/显示对话框显示对话框n nconnect(find_Btn,SIGNAL(clicked(),this,SLOT(show_findText();/connect(find_Btn,SIGNAL(clicked(),this,SLOT(show_findText();/设置
33、设置“查找下一个查找下一个”按钮的单击事件和其槽函数的关联按钮的单击事件和其槽函数的关联n n 第21页/共24页第二十二页,共24页。4.4.下面下面下面下面(xi mian)(xi mian)我们开始写实现查找功能的我们开始写实现查找功能的我们开始写实现查找功能的我们开始写实现查找功能的show_findText()show_findText()函数。函数。函数。函数。n nvoid MainWindow:show_findText()/“查找下一个”按钮的槽函数n nn nQString findText=find_textLineEdit-text();n n/获取(huq)行编辑器中的内容n n 第22页/共24页第二十三页,共24页。5、然后写出下面、然后写出下面(xi mian)的语的语句。句。n nif(!ui-textEdit-find(findText,QTextDocument:FindBackward)n nn nQMessageBox:warning(this,tr(“查找(ch zho)”),tr(“找不到%1).arg(findText);n n 第23页/共24页第二十四页,共24页。
限制150内