




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第17章【綜合實(shí)例】:Qt版Word字處理軟件核心功能界面演示17.117.2界面設(shè)計(jì)與開發(fā)基本編輯功能實(shí)現(xiàn)17.317.4文檔排版美化功能實(shí)現(xiàn)17.1
核心功能界面演示軟件典型的運(yùn)行界面如圖17.1所示。17.1
核心功能界面演示此外,在圖17.1中還給出了使用該軟件制作出的三個(gè)文檔示例。Qt版本W(wǎng)ord軟件制作出的文檔統(tǒng)一以HTML格式存盤,可使用Web瀏覽器打開觀看效果,如圖17.2所示。17.1
核心功能界面演示開發(fā)這個(gè)軟件也主要分為如下三個(gè)階段進(jìn)行。界面設(shè)計(jì)開發(fā)。界面設(shè)計(jì)開發(fā)內(nèi)容包括多窗體MDI程序框架的建立,菜單設(shè)計(jì),工具欄設(shè)計(jì),工具按鈕和狀態(tài)欄的幫助提示文本,多個(gè)文檔子窗口的管理和控制等。文本編輯功能實(shí)現(xiàn)。文本編輯功能實(shí)現(xiàn)主要包括文件的建立、打開和保存,文本的剪切、復(fù)制和粘貼,操作撤銷和恢復(fù)等這些最基本的文檔編輯功能。排版美化功能實(shí)現(xiàn)。排版美化功能實(shí)現(xiàn)包括字體選擇,字形、字號(hào)和文字顏色的設(shè)置,文檔段落標(biāo)號(hào)和編號(hào)的添加,段落對(duì)齊方式設(shè)置等高級(jí)功能實(shí)現(xiàn)。17.2
界面設(shè)計(jì)與開發(fā)17.2.1
建立MDI程序框架1.多文檔區(qū)域的創(chuàng)建在頭文件“myword.h”中添加QMdiArea類的聲明和定義變量:#ifndefMYWORD_H#define
MYWORD_H#include
<QMainWindow>classQMdiArea;classMyWord
:
publicQMainWindow{Q_OBJECTpublic:MyWord(QWidget
*parent
=
0);~MyWord();private
slots:private:QMdiArea
*mdiArea;};#endif
//MYWORD_H17.2.1
建立MDI程序框架在源文件“myword.cpp”的構(gòu)造函數(shù)中編寫如下代碼:#include
"myword.h"#include
<QtWidgets>MyWord::MyWord(QWidget
*parent):
QMainWindow(parent){mdiArea=
new
QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);setCentralWidget(mdiArea);move(200,150);resize(800,500);setWindowTitle(tr("Myself
Word"));}MyWord::~MyWord(){}17.2.1
建立MDI程序框架2.子窗口類的創(chuàng)建向項(xiàng)目中添加新文件,模板選擇“C++
Class”,類名命名為MyChild,基類命名為QTextEdit,勾選“Include
QWidget”,如圖17.3所示。完成后在“mychild.h”頭文件中添加代碼。17.2.1
建立MDI程序框架3.新建文件操作(1)newFile()的設(shè)計(jì)步驟。①設(shè)置窗口編號(hào)。②設(shè)置文件未被保存過“isUntitled=true;”。③保存文件路徑,為curFile賦初值。④設(shè)置子窗口標(biāo)題。⑤關(guān)聯(lián)文檔內(nèi)容改變信號(hào)contentsChanged()至顯示文檔更改狀態(tài)標(biāo)志槽documentWasModified()。17.2.1
建立MDI程序框架(2)newFile()的實(shí)現(xiàn)。在“mychild.cpp”文件中添加如下代碼://設(shè)置在子窗口關(guān)閉時(shí)銷毀這個(gè)類的對(duì)象//初始isUntitled為true#include
"mychild.h"#include
<QtWidgets>MyChild::MyChild(){setAttribute(Qt::WA_DeleteOnClose);isUntitled
=
true;}17.2.1
建立MDI程序框架在“mychild.cpp”文件中給出newFile()函數(shù)的實(shí)現(xiàn):void
MyChild::newFile(){//設(shè)置窗口編號(hào),因?yàn)榫幪?hào)會(huì)一直被保存,所以需要使用靜態(tài)變量static
int
sequenceNumber
=
1;//新建的文檔默認(rèn)未命名isUntitled
=
true;//將當(dāng)前文件命名為"文檔+編號(hào)"的形式,編號(hào)先使用再加1curFile=tr("文檔%1").arg(sequenceNumber++);//設(shè)置窗口標(biāo)題,使用[*]可以在文檔被更改后在文件名稱后顯示"*"號(hào)setWindowTitle(curFile
+
"[*]"
+
tr("
-
MyselfWord"));//文檔更改時(shí)發(fā)送contentsChanged()信號(hào),執(zhí)行documentWasModified()槽函數(shù)connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));}17.2.1
建立MDI程序框架(3)文件更改標(biāo)記。下面是documentWasModified()槽的定義:voidMyChild::documentWasModified(){//根據(jù)文檔的isModified()函數(shù)的返回值,判斷編輯器內(nèi)容是否被更改setWindowModified(document()->isModified());}編輯器內(nèi)容是否被更改,可以使用QTextDocument類的isModified()函數(shù)獲知,這里首先使用了QTextEdit類的document()函數(shù)來獲取它的QTextDocument類對(duì)象。17.2.1
建立MDI程序框架后面會(huì)看到,設(shè)置文檔子窗口標(biāo)題使用了userFriendlyCurrentFile()函數(shù),下面是它的定義:QString
MyChild::userFriendlyCurrentFile(){return
strippedName(curFile);}這里用到的strippedName函數(shù)用于修改文件名為較短的絕對(duì)路徑,代碼如下:QString
MyChild::strippedName(const
QString
&fullFileName){return
QFileInfo(fullFileName).fileName();}17.2.1
建立MDI程序框架為了簡單,本節(jié)暫且不考慮關(guān)閉文檔時(shí)的保存邏輯,在closeEvent()中無條件地接收關(guān)閉事件即可:void
MyChild::closeEvent(QCloseEvent
*event){event->accept();}17.2.2
菜單系統(tǒng)設(shè)計(jì)Myself
Word的菜單系統(tǒng)包括主菜單、菜單項(xiàng)和子菜單三級(jí)。若要設(shè)計(jì)菜單,則首先必須確定整個(gè)軟件系統(tǒng)的功能需求。在“myword.h”中聲明:class
QAction;class
QMenu;以及系統(tǒng)動(dòng)作和菜單的實(shí)現(xiàn)函數(shù):private:voidcreateActions();void
createMenus();17.2.2
菜單系統(tǒng)設(shè)計(jì)1.“文件”主菜單
“文件”主菜單功能項(xiàng)的設(shè)計(jì)見表17.1。17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.h”文件中,定義“文件”菜單指針:QMenu
*fileMenu;同時(shí),定義“文件”主菜單下各個(gè)功能項(xiàng)的QAction(動(dòng)作):QAction
*newAct;QAction
*openAct;QAction
*saveAct;QAction
*saveAsAct;QAction
*printAct;QAction
*printPreviewAct;QAction
*exitAct;在“myword.cpp”文件中編寫函數(shù)createActions()的代碼。17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.cpp”文件中編寫函數(shù)createMenus()的代碼:void
MyWord::createMenus(){//"文件"主菜單fileMenu=menuBar()->addMenu(tr("文件(&F)"));fileMenu->addAction(newAct);fileMenu->addAction(openAct);//分隔線//分隔線fileMenu->addSeparator();fileMenu->addAction(saveAct);fileMenu->addAction(saveAsAct);fileMenu->addSeparator();fileMenu->addAction(printAct);fileMenu->addAction(printPreviewAct);fileMenu->addSeparator();
//分隔線
fileMenu->addAction(exitAct);}17.2.2
菜單系統(tǒng)設(shè)計(jì)“文件”主菜單的運(yùn)行顯示效果如圖17.4所示。17.2.2
菜單系統(tǒng)設(shè)計(jì)2.“編輯”主菜單
“編輯”主菜單功能項(xiàng)的設(shè)計(jì)見表17.2。17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.h”文件中,定義“編輯”主菜單指針:QMenu
*editMenu;同時(shí),定義“編輯”主菜單下各個(gè)功能項(xiàng)的QAction(動(dòng)作):QAction
*undoAct;QAction
*redoAct;QAction
*cutAct;QAction
*copyAct;QAction
*pasteAct;在“myword.cpp”文件中函數(shù)createActions()的代碼中添加。17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.cpp”文件中函數(shù)createMenus()的代碼中添加:void
MyWord::createMenus(){//"文件"主菜單...//"編輯"主菜單editMenu=menuBar()->addMenu(tr("編輯(&E)"));editMenu->addAction(undoAct);editMenu->addAction(redoAct);editMenu->addSeparator();
//分隔線editMenu->addAction(cutAct);editMenu->addAction(copyAct);editMenu->addAction(pasteAct);}17.2.2
菜單系統(tǒng)設(shè)計(jì)“編輯”主菜單的運(yùn)行顯示效果如圖17.5所示。17.2.2
菜單系統(tǒng)設(shè)計(jì)3.“格式”主菜單
“格式”主菜單功能項(xiàng)的設(shè)計(jì)見表17.3。17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.h”頭文件中,定義“格式”主菜單及其子菜單的指針:QMenu
*formatMenu;QMenu
*fontMenu;QMenu
*alignMenu;//子菜單//子菜單同時(shí),定義“格式”主菜單及其子菜單下各個(gè)功能項(xiàng)的QAction(動(dòng)作):QAction
*boldAct;QAction
*italicAct;QAction
*underlineAct;QAction
*leftAlignAct;QAction
*centerAct;QAction
*rightAlignAct;QAction
*justifyAct;QAction
*colorAct;在“myword.cpp”文件的函數(shù)createActions()的代碼中繼續(xù)添加。17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.h”文件中,添加textAlign()聲明:private
slots:void
textAlign(QAction
*a);在“myword.cpp”文件中),添加textAlign()定義:void
MyWord::textAlign(QAction
*a){}17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.cpp”文件中,在函數(shù)createMenus()的代碼中添加:void
MyWord::createMenus(){//"字體"子菜單//"段落"子菜單...//"格式"主菜單formatMenu=menuBar()->addMenu(tr("格式(&O)"));fontMenu=formatMenu->addMenu(tr("字體(&D)"));fontMenu->addAction(boldAct);fontMenu->addAction(italicAct);fontMenu->addAction(underlineAct);alignMenu=formatMenu->addMenu(tr("段落"));alignMenu->addAction(leftAlignAct);alignMenu->addAction(centerAct);alignMenu->addAction(rightAlignAct);alignMenu->addAction(justifyAct);formatMenu->addAction(colorAct);}17.2.2
菜單系統(tǒng)設(shè)計(jì)“格式”主菜單的運(yùn)行顯示效果如圖17.6所示。選中其“段落”子菜單下的某一項(xiàng),該項(xiàng)的圖標(biāo)上會(huì)加上一個(gè)框,如圖17.7所示,同一時(shí)刻只能有一個(gè)菜單項(xiàng)的圖標(biāo)上有邊框。17.2.2
菜單系統(tǒng)設(shè)計(jì)4.“窗口”主菜單
“窗口”主菜單功能項(xiàng)的設(shè)計(jì)見表17.4。名
稱快捷鍵關(guān)閉(O)關(guān)閉所有(A)平鋪(T)層疊(C)下一個(gè)(X)Ctrl+Tab前一個(gè)(V)Ctrl+Shift+Backtab17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.h”頭文件中,定義“窗口”主菜單指針:QMenu
*windowMenu;同時(shí),定義“窗口”主菜單下各個(gè)功能項(xiàng)的QAction(動(dòng)作):QAction
*closeAct;QAction
*closeAllAct;QAction
*tileAct;QAction
*cascadeAct;QAction
*nextAct;QAction
*previousAct;QAction
*separatorAct;在“myword.cpp”文件中,在函數(shù)createActions()的代碼中添加。17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.cpp”文件中,在函數(shù)createMenus()的代碼中添加:void
MyWord::createMenus(){...//“窗口”主菜單windowMenu=menuBar()->addMenu(tr("窗口(&W)"));updateWindowMenu();connect(windowMenu,SIGNAL(aboutToShow()),
this,
SLOT(updateWindow
Menu()));menuBar()->addSeparator();}“窗口”主菜單的運(yùn)行顯示效果如圖17.8所示。17.2.2
菜單系統(tǒng)設(shè)計(jì)5.“幫助”主菜單“幫助”主菜單結(jié)構(gòu)很簡單,無須專門設(shè)計(jì)功能項(xiàng)列表,直接編程實(shí)現(xiàn)即可。在“myword.h”頭文件中,定義“幫助”主菜單指針:QMenu
*helpMenu;同時(shí),定義“幫助”主菜單下兩個(gè)功能項(xiàng)的QAction(動(dòng)作):QAction
*aboutAct;QAction
*aboutQtAct;17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.cpp”文件中,在createActions()函數(shù)的代碼中添加:void
MyWord::createActions(){.../*“幫助”主菜單動(dòng)作集*/aboutAct=new
QAction(tr("關(guān)于(&A)"),
this);aboutAct->setStatusTip(tr("關(guān)于Myself
Word"));connect(aboutAct,SIGNAL(triggered()),this,SLOT(about()));aboutQtAct=new
QAction(tr("關(guān)于Qt(&Q)"),this);aboutQtAct->setStatusTip(tr("關(guān)于Qt
庫"));connect(aboutQtAct,
SIGNAL(triggered()),
qApp,
SLOT(aboutQt()));}17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.h”文件中,添加about()聲明:private
slots:voidabout();在“myword.cpp”文件中,添加about()定義:voidMyWord::about(){QMessageBox::about(this,tr("關(guān)于"),tr("這是一個(gè)基于Qt
實(shí)現(xiàn)的文字處理軟件,具備類似微軟Office
Word
的功能."));}17.2.2
菜單系統(tǒng)設(shè)計(jì)在“myword.cpp”文件中,在函數(shù)createMenus()的代碼中添加:void
MyWord::createMenus(){...//"幫助"主菜單helpMenu=menuBar()->addMenu(tr("幫助(&H)"));helpMenu->addAction(aboutAct);helpMenu->addSeparator();
//分隔線helpMenu->addAction(aboutQtAct);}“幫助”主菜單的運(yùn)行顯示效果如圖17.9所示,選擇“幫助”→“關(guān)于”菜單項(xiàng),彈出如圖17.10所示的消息框,顯示Myself
Word程序的簡介信息。17.2.3
工具欄設(shè)計(jì)本系統(tǒng)的工具欄共有四個(gè)工具條,其中三個(gè)分別對(duì)應(yīng)“文件”、“編輯”和
“格式”菜單的功能,如圖17.11(a)~圖17.11(c)所示;最后一個(gè)為組合選擇欄,它提供一組選擇框控件,如圖17.11(d)所示,實(shí)現(xiàn)用戶給文本選擇段落標(biāo)號(hào),添加加編號(hào),更改字體和字號(hào)等高級(jí)功能。17.2.3
工具欄設(shè)計(jì)1.工具條開發(fā)在“myword.h”頭文件中聲明:class
QComboBox;class
QFontComboBox;以及工具欄的實(shí)現(xiàn)函數(shù):private:void
createToolBars();定義各個(gè)工具條及其上子控件的指針:QToolBar
*fileToolBar;QToolBar
*editToolBar;QToolBar
*formatToolBar;QToolBar
*comboToolBar;QComboBox
*comboStyle;QFontComboBox
*comboFont;QComboBox
*comboSize;//"文件"工具條//"編輯"工具條//"格式"工具條//組合選擇欄//標(biāo)號(hào)與編號(hào)類型選擇框//字體選擇框//字號(hào)選擇框在“myword.cpp”文件中實(shí)現(xiàn)createToolBars()函數(shù),代碼為。17.2.3
工具欄設(shè)計(jì)2.導(dǎo)入圖標(biāo)資源在項(xiàng)目名上單擊鼠標(biāo)右鍵,選擇“添加新文件...”菜單項(xiàng),在彈出的如圖
17.12所示的“新建文件”對(duì)話框中,選擇模板“Qt”→“Qt
Resource
File”菜單項(xiàng),單擊“Choose...”按鈕,在彈出的對(duì)話框中將資源文件命名為“myword”。17.2.3
工具欄設(shè)計(jì)完成后,在項(xiàng)目工程目錄樹下新出現(xiàn)一項(xiàng)“myword.qrc”(如圖17.13所示),即是本例新建的資源文件。17.2.3
工具欄設(shè)計(jì)在“myword.qrc”項(xiàng)上單擊鼠標(biāo)右鍵,選擇“用...打開”→“普通文本編輯器”菜單項(xiàng),錄入內(nèi)容如下:<RCC><qresource
prefix="/"><file>images/editcopy.png</file><file>images/editcut.png</file><file>images/editpaste.png</file><file>images/editredo.png</file><file>images/editundo.png</file><file>images/filenew.png</file><file>images/fileopen.png</file><file>images/fileprint.png</file><file>images/filesave.png</file><file>images/textbold.png</file><file>images/textcenter.png</file><file>images/textitalic.png</file><file>images/textjustify.png</file><file>images/textleft.png</file><file>images/textright.png</file><file>images/textunder.png</file></qresource></RCC>17.2.3
工具欄設(shè)計(jì)在“myword.cpp”文件的開頭設(shè)置資源路徑:const
QString
rsrcPath=
":/images";MyWord::MyWord(QWidget
*parent):
QMainWindow(parent){...}最終完成的工具欄運(yùn)行效果如圖17.14所示。17.2.4
子窗口管理1.新建子窗口本書之前在建立MDI程序框架時(shí)已經(jīng)建立了自己子窗口的中心部件MyChild類,它繼承自QTextEDit類,下面便可以使用這個(gè)類來創(chuàng)建文檔子窗口。在“myword.h”頭文件中添加MyChild類的前置聲明:class
MyChild;同時(shí)添加私有槽函數(shù)聲明:private
slots:void
fileNew();...MyChild
*createMyChild();//新建文件操作//創(chuàng)建子窗口在“myword.cpp”文件中包含頭文件:#include
"mychild.h"17.2.4
子窗口管理并添加槽createMyChild()的定義:MyChild
*MyWord::createMyChild(){MyChild
*child=new
MyChild; //創(chuàng)建MyChild部件mdiArea->addSubWindow(child);//向多文檔區(qū)域添加子窗口,child為中心部件//根據(jù)QTextEdit類是否可以復(fù)制信號(hào),設(shè)置剪切、復(fù)制動(dòng)作是否可用
connect(child,SIGNAL(copyAvailable(bool)),cutAct,SLOT(setEnabled(bool)));connect(child,
SIGNAL(copyAvailable(bool)),copyAct,
SLOT(setEnabled(bool)));return
child;}17.2.4
子窗口管理下面將之前已編寫的“文件”→“新建”菜單項(xiàng)Action創(chuàng)建語句后面的connect語句前的注釋符“//”去掉:connect(newAct,
SIGNAL(triggered()),
this,
SLOT(fileNew()));并實(shí)現(xiàn)fileNew()函數(shù)的代碼如下:voidMyWord::fileNew(){MyChild
*child
=
createMyChild();child->newFile();child->show();enabledText();}新建文件操作首先調(diào)用createMyChild()函數(shù)創(chuàng)建子窗口,最后調(diào)用enabledText()函數(shù)的目的是使格式菜單及其對(duì)應(yīng)的各工具按鈕變?yōu)榭捎脿顟B(tài)。在“myword.h”頭文件中,添加enabledText()函數(shù)聲明:private:...voidenabledText();17.2.4
子窗口管理在“myword.cpp”文件中,添加enabledText()函數(shù)實(shí)現(xiàn):voidMyWord::enabledText(){boldAct->setEnabled(true);italicAct->setEnabled(true);underlineAct->setEnabled(true);leftAlignAct->setEnabled(true);centerAct->setEnabled(true);rightAlignAct->setEnabled(true);justifyAct->setEnabled(true);colorAct->setEnabled(true);}17.2.4
子窗口管理運(yùn)行程序時(shí),選擇“文件”→“新建”菜單或單擊工具欄的按鈕,出現(xiàn)“文檔1”子窗口,如圖17.15所示。17.2.4
子窗口管理2.更新菜單狀態(tài)在“myword.h”頭文件中添加前置聲明:class
QMdiSubWindow;同時(shí)添加私有槽:private
slots://更新菜單...voidupdateMenus();添加私有變量和函數(shù):private:...MyChild
*activeMyChild();//活動(dòng)窗口17.2.4
子窗口管理在MyWord類(在“myword.cpp”文件中)的構(gòu)造函數(shù)中添加如下代碼:MyWord::MyWord(QWidget
*parent):QMainWindow(parent){mdiArea
=
new
QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);setCentralWidget(mdiArea);connect(mdiArea,
SIGNAL(subWindowActivated(QMdiSubWindow*)),this,SLOT(updateMenus()));updateMenus();move(200,150);resize(800,500);setWindowTitle(tr("Myself
Word"));}17.2.4
子窗口管理updateMenus()函數(shù)代碼(在“myword.cpp”文件中)。判斷是否有活動(dòng)子窗口用activeMyChild()函數(shù),代碼如下:MyChild
*MyWord::activeMyChild(){//若有活動(dòng)窗口,則將其內(nèi)的中心部件轉(zhuǎn)換為MyChild類型;若沒有,則直接返回0if
(QMdiSubWindow
*activeSubWindow
=
mdiArea->activeSubWindow())return
qobject_cast<MyChild
*>(activeSubWindow->widget());return
0;}17.2.4
子窗口管理3.添加子窗口列表首先在“myword.h”頭文件中添加類的前置聲明:class
QSignalMapper;然后,添加私有對(duì)象指針:private:...QSignalMapper
*windowMapper;這其實(shí)是定義了一個(gè)信號(hào)映射器。再添加私有槽聲明:private
slots:...void
updateWindowMenu();17.2.4
子窗口管理首先在MyWord的構(gòu)造函數(shù)中添加如下代碼:MyWord::MyWord(QWidget
*parent):QMainWindow(parent){...//創(chuàng)建信號(hào)映射器windowMapper
=
new
QSignalMapper(this);//映射器重新發(fā)送信號(hào),根據(jù)信號(hào)設(shè)置活動(dòng)窗口connect(windowMapper,
SIGNAL(mapped(QWidget*)),this,
SLOT(setActiveSubWindow(QWidget*)));...}17.2.4
子窗口管理這里首先創(chuàng)建了信號(hào)映射器,并且將它的mapped()信號(hào)關(guān)聯(lián)到設(shè)置活動(dòng)窗口槽上。然后更新窗口菜單,同時(shí)將窗口菜單將要顯示的信號(hào)關(guān)聯(lián)到更新的菜單槽上,這兩行代碼位于createMenus()函數(shù)中:void
MyWord::createMenus(){...//"窗口"主菜單windowMenu=menuBar()->addMenu(tr("窗口(&W)"));updateWindowMenu();connect(windowMenu,SIGNAL(aboutToShow()),this,SLOT(updateWindowMenu()));menuBar()->addSeparator();}更新菜單的槽函數(shù)updateWindowMenu()的實(shí)現(xiàn)代碼。17.2.4
子窗口管理這時(shí)運(yùn)行程序,新建四個(gè)文檔,“窗口”菜單的顯示效果如圖17.16所示。17.2.4
子窗口管理4.窗口關(guān)閉在“myword.h”頭文件中聲明:protected:void
closeEvent(QCloseEvent
*event);在“myword.cpp”文件中編寫關(guān)閉事件代碼:void
MyWord::closeEvent(QCloseEvent
*event){mdiArea->closeAllSubWindows();if
(mdiArea->currentSubWindow())
{event->ignore();}
else
{event->accept();}}17.2.5
界面生成試運(yùn)行為了使讀者從整體上理解軟件界面生成的原理和過程,特將“myword.h”頭文件及MyWord類構(gòu)造函數(shù)的源代碼完整列出?!癿yword.h”頭文件代碼。MyWord類構(gòu)造函數(shù)源代碼(在“myword.cpp”文件中)。生成狀態(tài)欄的createStatusBar()函數(shù)定義如下:void
MyWord::createStatusBar(){statusBar()->showMessage(tr("就緒"));}17.2.5
界面生成試運(yùn)行運(yùn)行程序,顯示軟件MyselfWord主界面,此時(shí),雖然很多菜單項(xiàng)及工具按鈕的功能尚未開發(fā),但可以支持新建空白文檔、關(guān)閉文檔,并可以將多個(gè)文檔的窗口平鋪或?qū)盈B顯示,如圖17.17所示。17.3
基本編輯功能實(shí)現(xiàn)17.3.1
打開文件1.加載文件操作步驟加載文件操作的步驟如下。①打開指定的文件,并讀取文件內(nèi)容到編輯器。②設(shè)置當(dāng)前文件的setCurrentFile(),該函數(shù)可以獲取文件路徑,完成文件和窗口狀態(tài)的設(shè)置。③關(guān)聯(lián)文檔內(nèi)容改變信號(hào)到顯示文檔更改狀態(tài)標(biāo)志槽documentWasModified()。17.3.1
打開文件2.加載文件操作實(shí)現(xiàn)在“mychild.h”頭文件中添加聲明:public:...bool
loadFile(const
QString
&fileName);加載文件操作代碼如下:其中,在加載文件操作中使用了QFile類對(duì)象,它可以打開指定的文件,并且與QByteArray類配合使用,方便進(jìn)行文件的讀取與寫入操作。在讀取文件完成后還調(diào)用了setCurrentFile()函數(shù),在“mychild.h”頭文件中聲明:private:void
setCurrentFile(const
QString
&fileName);17.3.1
打開文件下面是它的定義:void
MyChild::setCurrentFile(const
QString
&fileName){curFile
=
QFileInfo(fileName).canonicalFilePath();//文件已經(jīng)被保存過isUntitled
=
false;//文檔沒有被更改過document()->setModified(false);//窗口不顯示被更改標(biāo)志setWindowModified(false);//設(shè)置窗口標(biāo)題,userFriendlyCurrentFile()返回文件名setWindowTitle(userFriendlyCurrentFile()
+
"[*]");}17.3.1
打開文件3.加載文件操作的調(diào)用下面將之前已編寫的“文件”→“打開”菜單項(xiàng)Action創(chuàng)建語句后面的connect語句前的注釋符“//”去掉:connect(openAct,
SIGNAL(triggered()),
this,
SLOT(fileOpen()));在“myword.h”頭文件中聲明槽:private
slots:...voidfileOpen();17.3.1
打開文件實(shí)現(xiàn)fileOpen()函數(shù)的代碼如下:void
MyWord::fileOpen(){QStringfileName=QFileDialog::getOpenFileName(this,tr("打開"),QString(),tr("HTML
文檔(*.htm*.html);;所有文件(*.*)"));if
(!fileName.isEmpty())
{QMdiSubWindow
*existing
=
findMyChild(fileName);if
(existing)
{mdiArea->setActiveSubWindow(existing);return;}MyChild
*child
=
createMyChild();if
(child->loadFile(fileName))
{statusBar()->showMessage(tr("文件已載入"),2000);child->show();}
else
{child->close();}}}17.3.1
打開文件在“myword.h”頭文件中添加函數(shù)聲明:private:...QMdiSubWindow
*findMyChild(const
QString
&fileName);//查找子窗口下面查找子窗口函數(shù)findMyChild()的實(shí)現(xiàn):QMdiSubWindow
*MyWord::findMyChild(const
QString
&fileName){QString
canonicalFilePath
=
QFileInfo(fileName).canonicalFilePath();foreach
(QMdiSubWindow
*window,
mdiArea->subWindowList())
{MyChild
*myChild
=
qobject_cast<MyChild
*>(window->widget());if
(myChild->currentFile()
==
canonicalFilePath)return
window;}return
0;}17.3.1
打開文件首先利用記事本編輯內(nèi)容“我愛Qt
5編程!”,以文件名“文檔1.html”保存到D:\Qt\CH17\build-MyselfWord-Desktop_Qt_5_4_0_MinGW_32bit-Debug目錄下,然后運(yùn)行程序,選擇主菜單“文件”→“打開”菜單項(xiàng),或單擊工具欄的按鈕,可以看到新編輯存盤的文件內(nèi)容,如圖17.18所示。17.3.2
保存文件1.保存文件操作步驟
“保存”操作save()的邏輯如下。①如果文件沒有被保存過(用isUntitled判斷),則執(zhí)行“另存為”操作saveAs()。②否則直接“保存”文件saveFile(),該函數(shù)首先打開指定文件,然后將編輯器的內(nèi)容寫入該文件,最后設(shè)置當(dāng)前文件setCurrentFile()。“另存為”操作saveAs()的邏輯如下。①從文件對(duì)話框獲取文件路徑。②如果路徑不為空,則保存文件saveFile()。17.3.2
保存文件2.保存文件操作實(shí)現(xiàn)在“mychild.h”頭文件中添加聲明:public:...bool
save();bool
saveAs();bool
saveFile(QString
fileName);下面是“保存”操作的代碼:bool
MyChild::save(){if
(isUntitled)
{return
saveAs();}
else
{return
saveFile(curFile);}}17.3.2
保存文件下面是“另存為”操作函數(shù)的定義:bool
MyChild::saveAs(){QStringfileName=QFileDialog::getSaveFileName(this,tr("另存為"),curFile,tr("HTML
文檔(*.htm
*.html);;所有文件(*.*)"));//獲取文件路徑,如果為空,則返回false,否則保存文件if
(fileName.isEmpty())return
false;return
saveFile(fileName);}17.3.2
保存文件“另存為”操作中就是首先使用文件對(duì)話框獲取文件路徑,如果路徑不為空,則進(jìn)行文件的寫入,它由saveFile()函數(shù)執(zhí)行:bool
MyChild::saveFile(QString
fileName){if
(!(fileName.endsWith(".htm",
Qt::CaseInsensitive)
||
fileName.endsWith(".html",
Qt::CaseInsensitive)))
{fileName+=".html";//默認(rèn)保存為HTML
文檔}QTextDocumentWriter
writer(fileName);bool
success
=
writer.write(this->document());if
(success)setCurrentFile(fileName);return
success;}17.3.2
保存文件3.保存文件操作調(diào)用下面將之前已編寫的“文件”→“保存”、“另存為”兩個(gè)菜單項(xiàng)Action創(chuàng)建語句后面的connect語句前的注釋符“//”去掉:connect(saveAct,
SIGNAL(triggered()),
this,
SLOT(fileSave()));...connect(saveAsAct,
SIGNAL(triggered()),
this,
SLOT(fileSaveAs()));在“myword.h”頭文件中聲明槽:private
slots:...voidfileSave();voidfileSaveAs();17.3.2
保存文件因?yàn)椤氨4妗?、“另存為”操作在MyChild類中已經(jīng)實(shí)現(xiàn)了,這里只需要調(diào)用相應(yīng)的函數(shù)即可,代碼如下:void
MyWord::fileSave(){if
(activeMyChild()&&
activeMyChild()->save())statusBar()->showMessage(tr("保存成功"),2000);}voidMyWord::fileSaveAs(){if
(activeMyChild()&&
activeMyChild()->saveAs())statusBar()->showMessage(tr("保存成功"),2000);}17.3.2
保存文件4.提醒保存文件為了在用戶關(guān)閉文檔時(shí)主動(dòng)提醒用戶保存,這里還需要設(shè)計(jì)“關(guān)閉”事件的邏輯,通過定義一個(gè)函數(shù)maybeSave()來實(shí)現(xiàn)。在“mychild.h”頭文件中添加聲明:private:bool
maybeSave();17.3.2
保存文件maybeSave()函數(shù)實(shí)現(xiàn)代碼:
bool
MyChild::maybeSave(){if
(!document()->isModified())return
true;QMessageBox::StandardButton
ret;ret=QMessageBox::warning(this,tr("MyselfQtWord"),tr("文檔'%1'已被修改,保存嗎?").arg(userFriendlyCurrentFile()),QMessageBox::Save
|
QMessage
Box::Discard|
QMessageBox::Cancel);if
(ret
==
QMessageBox::Save)return
save();else
if
(ret
==
QMessageBox::Cancel)return
false;return
true;}17.3.2
保存文件“關(guān)閉”操作closeEvent()的邏輯如下。①如果maybeSave()函數(shù)返回值為真,則關(guān)閉窗口。②如果maybeSave()函數(shù)返回值為假,則忽略該事件。closeEvent()的代碼如下:void
MyChild::closeEvent(QCloseEvent
*event){if
(maybeSave())
{event->accept();}
else
{event->ignore();}}17.3.2
保存文件運(yùn)行程序,新建一個(gè)文檔,編輯內(nèi)容“Qt版Word真好用!”,選擇主菜單
“窗口”→“關(guān)閉”,彈出如圖17.19(a)所示的提示框,單擊“Save”按鈕,彈出如圖17.19(b)所示的“另存為”對(duì)話框,將文件改名為“文檔2”后保存。17.3.3
文本操作1.撤銷與重做在“編輯”→“撤銷”、“重做”兩個(gè)菜單項(xiàng)Action創(chuàng)建語句后面分別添加connect語句(代碼中加黑語句):/*"編輯"菜單動(dòng)作集*/undoAct=newQAction(QIcon(rsrcPath+"/editundo.png"),tr("撤銷(&U)"),this);undoAct->setShortcut(QKeySequence::Undo);undoAct->setToolTip("撤銷");undoAct->setStatusTip(tr("撤銷當(dāng)前操作"));connect(undoAct,
SIGNAL(triggered()),this,
SLOT(undo()));redoAct=new
QAction(QIcon(rsrcPath+"/editredo.png"),tr("重做(&R)"),this);redoAct->setShortcut(QKeySequence::Redo);redoAct->setToolTip("重做");redoAct->setStatusTip(tr("恢復(fù)之前操作"));connect(redoAct,
SIGNAL(triggered()),
this,
SLOT(redo()));17.3.3
文本操作2.剪切、復(fù)制和粘貼將之前已編寫的“編輯”→“剪切”、“復(fù)制”、“粘貼”三個(gè)菜單項(xiàng)Action創(chuàng)建語句后面的connect語句前的注釋符“//”去掉:connect(cutAct,
SIGNAL(triggered()),
this,
SLOT(cut()));...connect(copyAct,
SIGNAL(triggered()),
this,
SLOT(copy()));...connect(pasteAct,
SIGNAL(triggered()),
this,
SLOT(paste()));在“myword.h”頭文件中聲明槽:private
slots:...void
undo();void
redo();void
cut();void
copy();void
paste();因?yàn)橐陨线@些操作在MyChild類的父類QTextEdit中已經(jīng)實(shí)現(xiàn)了,所以這里只需要調(diào)用相應(yīng)的函數(shù)即可,代碼為。17.4
文檔排版美化功能實(shí)現(xiàn)17.4.1
字體格式設(shè)置1.子窗口的操作子窗口通過mergeFormatOnWordOrSelection()函數(shù)操作設(shè)置字體格式。在“mychild.h”頭文件中聲明:public:...void
mergeFormatOnWordOrSelection(const
QTextCharFormat
&format);在“mychild.cpp”文件中編寫其代碼:void
MyChild::mergeFormatOnWordOrSelection(const
QTextCharFormat
&format){QTextCursor
cursor
=
this->textCursor();if
(!cursor.hasSelection())cursor.select(QTextCursor::WordUnderCursor);cursor.mergeCharFormat(format);this->mergeCurrentCharFormat(format);}17.4.1
字體格式設(shè)置2.主窗口調(diào)用格式函數(shù)將之前已編寫的“格式”→“字體”→“加粗”、“傾斜”、“下畫線”三個(gè)子菜單項(xiàng)Action創(chuàng)建語句后面的connect語句前的注釋符“//”去掉:connect(boldAct,
SIGNAL(triggered()),
this,
SLOT(textBold()));...connect(italicAct,
SIGNAL(triggered()),
this,
SLOT(textItalic()));...connect(underlineAct,
SIGNAL(triggered()),
this,
SLOT(textUnderline
()));在“myword.h”頭文件中聲明槽:private
slots:...void
textBold();void
textItalic();void
textUnderline();在“myword.cpp”文件中實(shí)現(xiàn)它們的代碼為。17.4.1
字體格式設(shè)置3.字體、字號(hào)選擇框?qū)崿F(xiàn)為了使程序能夠支持從組合工具欄中選擇字體類型、字號(hào),在createToolBars()函數(shù)中將以下代碼中加黑語句前的注釋符“//”去掉。在“myword.h”頭文件中聲明槽:private
slots:...void
textFamily(const
QString
&f);void
textSize(const
QString
&p);17.4.1
字體格式設(shè)置在“myword.cpp”文件中實(shí)現(xiàn)它們的代碼如下:void
MyWord::textFamily(const
QString
&f){QTextCharFormat
fmt;fmt.setFontFamily(f);if(activeMyChild())activeMyChild()->mergeFormatOnWordOrSelection(fmt);}void
MyWord::textSize(const
QString&p){qreal
pointSize
=
p.toFloat();if
(p.toFloat()
>
0)
{QTextCharFormat
fmt;fmt.setFontPointSize(pointSize);if(activeMyChild())activeMyChild()->mergeFormatOnWordOrSelection(fmt);}}17.4.1
字體格式設(shè)置運(yùn)行程序,打開“文檔1”,選中當(dāng)中的文本“Qt
5”,選擇字體類型為
“Arial
Black”,字號(hào)20,傾斜加下畫線,效果如圖17.20所示。17.4.2
段落對(duì)齊設(shè)置在“mychild.h”頭文件中聲明:public:...void
setAlign(int
align);在“mychild.cpp”文件中編寫其代碼:void
MyChild::setAlign(int
align){if
(align
==
1)this->setAlignment(Qt::AlignLeft
|
Qt::AlignAbsolute);else
if
(align
==
2)this->setAlignment(Qt::AlignHCenter);else
if
(align
==
3)this->setAlignment(Qt::AlignRight
|
Qt::AlignAbsolute);else
if
(align
==
4)this->setAlignment(Qt::AlignJustify);}17.4.2
段落對(duì)齊設(shè)置在之前已編寫的textAlign()函數(shù)體中編寫代碼:void
MyWord::textAlign(QAction
*a){if(activeMyChild()){if
(a
==
leftAlignAct)activeMyChild()->setAlign(1);else
if
(a
==
centerAct)activeMyChild()->setAlign(2);else
if
(a
==
rightAlignAct)activeMyChild()->setAlign(3);else
if
(a
==
justifyAct)activeMyChild()->setAlign(4);}}17.4.2
段落對(duì)齊設(shè)置(居中)按鈕,文字變?yōu)榫舆\(yùn)行程序,將“文檔1”子窗口最大化,單擊中顯示,如圖17.21所示。17.4.3
顏色設(shè)置將之前已編寫的“格式”→“顏色”菜單項(xiàng)Action創(chuàng)建語句后面的connect語句前的注釋符“//”去掉:QPixmap
pix(16,
16);pix.fill(Qt::red);colorAct=newQAction(pix,tr("顏色(&C)..."),this);colorAct->setToolTip("顏色");colorAct->setStatusTip(tr("設(shè)置文字顏色"));connect(colorAct,
SIGNAL(triggered()),
this,
SLOT(textColor()));在“myword.h”頭文件中聲明槽:private
slots:...void
textColor();17
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 消費(fèi)者隱私保護(hù)與營銷-深度研究
- 供應(yīng)鏈風(fēng)險(xiǎn)管理的多維度分析方法-深度研究
- 高效透明導(dǎo)電氧化物-深度研究
- JJF 2207-2025醫(yī)用空氣系統(tǒng)校準(zhǔn)規(guī)范
- 2025至2030年中國雙吊墩字臺(tái)數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國PVC密實(shí)拉鏈袋數(shù)據(jù)監(jiān)測研究報(bào)告
- 訴求類面試試題及答案
- 統(tǒng)編版語文三年級(jí)下冊(cè)期末達(dá)標(biāo)測試卷(模擬沖刺)(含答案)
- 山東省東營市利津高級(jí)中學(xué)2024-2025學(xué)年高一下學(xué)期第一次月考?xì)v史試題(含答案)
- 2019-2025年軍隊(duì)文職人員招聘之軍隊(duì)文職教育學(xué)押題練習(xí)試卷B卷附答案
- 雙新背景下小學(xué)英語單元整體作業(yè)設(shè)計(jì)與優(yōu)化探索 論文
- 大學(xué)生勞動(dòng)教育教程全套PPT完整教學(xué)課件
- GB/T 985.1-2008氣焊、焊條電弧焊、氣體保護(hù)焊和高能束焊的推薦坡口
- GB/T 15970.7-2000金屬和合金的腐蝕應(yīng)力腐蝕試驗(yàn)第7部分:慢應(yīng)變速率試驗(yàn)
- 中共一大會(huì)址
- 制度經(jīng)濟(jì)學(xué):05團(tuán)隊(duì)生產(chǎn)理論
- 作文格子紙(1000字)
- 刻度尺讀數(shù)練習(xí)(自制)課件
- 四年級(jí)下冊(cè)美術(shù)課件 4紙卷魔術(shù)|蘇少版
- 七年級(jí)數(shù)學(xué)蘇科版下冊(cè) 101 二元一次方程 課件
- ZL50裝載機(jī)工作裝置設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論