第17章綜合實(shí)例qt版字處理軟件_第1頁
第17章綜合實(shí)例qt版字處理軟件_第2頁
第17章綜合實(shí)例qt版字處理軟件_第3頁
第17章綜合實(shí)例qt版字處理軟件_第4頁
第17章綜合實(shí)例qt版字處理軟件_第5頁
已閱讀5頁,還剩88頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論