版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第5章 Qt 5主窗口Qt 5主窗口構(gòu)成1菜單欄2狀態(tài)欄3工具欄4錨接部件5中心部件01基 本 元 素基 本 元 素QMainWindow是一個(gè)為用戶(hù)提供主窗口程序的類(lèi),包含一個(gè)菜單欄(menu bar)、多個(gè)工具欄(tool bars)、多個(gè)錨接部件(dock widgets)、一個(gè)狀態(tài)欄(status bar)及一個(gè)中心部件(central widget),是許多應(yīng)用程序(如文本編輯器、圖片編輯器等)的基礎(chǔ)。本章將對(duì)此進(jìn)行詳細(xì)介紹。Qt主窗口界面布局如圖5.1所示?;?本 元 素1菜單欄菜單是一系列命令的列表。為了實(shí)現(xiàn)菜單、工具欄按鈕、鍵盤(pán)快捷方式等命令的一致性,Qt使用動(dòng)作(Action
2、)來(lái)表示這些命令。Qt的菜單就是由一系列的QAction動(dòng)作對(duì)象構(gòu)成的列表,而菜單欄則是包容菜單的面板,它位于主窗口標(biāo)題欄的下面。一個(gè)主窗口只能有一個(gè)菜單欄。2狀態(tài)欄狀態(tài)欄通常顯示GUI應(yīng)用程序的一些狀態(tài)信息,它位于主窗口的底部。用戶(hù)可以在狀態(tài)欄上添加、使用Qt窗口部件。一個(gè)主窗口只能有一個(gè)狀態(tài)欄。3工具欄工具欄是由一系列的類(lèi)似于按鈕的動(dòng)作排列而成的面板,它通常由一些經(jīng)常使用的命令(動(dòng)作)組成。工具欄位于菜單欄的下面、狀態(tài)欄的上面,可以??吭谥鞔翱诘纳稀⑾?、左、右四個(gè)方向上。一個(gè)主窗口可以包含多個(gè)工具欄?;?本 元 素4錨接部件錨接部件作為一個(gè)容器使用,以包容其他窗口部件來(lái)實(shí)現(xiàn)某些功能。例如,
3、Qt設(shè)計(jì)器的屬性編輯器、對(duì)象監(jiān)視器等都是由錨接部件包容其他的Qt窗口部件來(lái)實(shí)現(xiàn)的。它位于工具欄區(qū)的內(nèi)部,可以作為一個(gè)窗口自由地浮動(dòng)在主窗口上面,也可以像工具欄一樣停靠在主窗口的上、下、左、右四個(gè)方向上。一個(gè)主窗口可以包含多個(gè)錨接部件。5中心部件中心部件處在錨接部件區(qū)的內(nèi)部、主窗口的中心。一個(gè)主窗口只能有一個(gè)中心部件。02【綜合實(shí)例】文本編輯器【綜合實(shí)例】文本編輯器(1)文件操作功能:包括新建一個(gè)文件,利用標(biāo)準(zhǔn)文件對(duì)話框QFileDialog類(lèi)打開(kāi)一個(gè)已存在的文件,利用QFile和QTextStream讀取文件內(nèi)容,打印文件(分文本打印和圖像打?。?。通過(guò)實(shí)例介紹標(biāo)準(zhǔn)打印對(duì)話框QPrintDial
4、og類(lèi)的使用方法,以QPrinter作為QPaintDevice畫(huà)圖工具實(shí)現(xiàn)圖像打印。(2)圖像處理軟件中的常用功能:包括圖片的縮放、旋轉(zhuǎn)、鏡像等坐標(biāo)變換,使用QMatrix實(shí)現(xiàn)圖像的各種坐標(biāo)變換。(3)開(kāi)發(fā)文本編輯功能:通過(guò)在工具欄上設(shè)置文字字體、字號(hào)大小、加粗、斜體、下畫(huà)線及字體顏色等快捷按鈕的實(shí)現(xiàn),介紹在工具欄中嵌入控件的方法。其中,通過(guò)設(shè)置字體顏色功能,介紹標(biāo)準(zhǔn)顏色對(duì)話框QColorDialog類(lèi)的使用方法。(4)排版功能:通過(guò)選擇某種排序方式實(shí)現(xiàn)對(duì)文本排序,以及實(shí)現(xiàn)文本對(duì)齊(包括左對(duì)齊、右對(duì)齊、居中對(duì)齊和兩端對(duì)齊)和撤銷(xiāo)、重做的方法?!揪C合實(shí)例】文本編輯器【例】(難度一般)(CH50
5、1)設(shè)計(jì)界面,效果如圖5.2所示?!揪C合實(shí)例】文本編輯器首先建立項(xiàng)目的框架代碼,具體步驟如下。(1)新建Qt Widgets Application(詳見(jiàn)1.3.1節(jié)),項(xiàng)目名稱(chēng)為“ImageProcessor”,基類(lèi)選擇“QMainWindow”,類(lèi)名命名為“ImgProcessor”,取消“創(chuàng)建界面”復(fù)選框的選中狀態(tài)。單擊“下一步”按鈕,最后單擊“完成”按鈕,完成該項(xiàng)目工程的建立。(2)添加該工程的提供主要顯示文本編輯框函數(shù)所在的文件,在“ImageProcessor”項(xiàng)目名上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添加新文件.”選項(xiàng),在彈出的對(duì)話框中選擇“C+ Class”選項(xiàng),單擊“Ch
6、oose.”按鈕,在彈出的對(duì)話框的“Base class”下拉列表框中選擇基類(lèi)名“QWidget”,在“Class name”文本框中輸入類(lèi)的名稱(chēng)“ShowWidget”。(3)單擊“下一步”按鈕,單擊“完成”按鈕,添加“showwidget.h”頭文件和“showwidget.cpp”源文件。【綜合實(shí)例】文本編輯器(4)打開(kāi)“showwidget.h”頭文件,具體代碼如下:#include #include #include #include class ShowWidget : public QWidget Q_OBJECTpublic: explicit ShowWidget(QWidg
7、et *parent = 0); QImage img; QLabel *imageLabel; QTextEdit *text;signals:public slots:;【綜合實(shí)例】文本編輯器(5)打開(kāi)“showwidget.cpp”文件,添加如下代碼:#include showwidget.h#include ShowWidget:ShowWidget(QWidget *parent):QWidget(parent) imageLabel =new QLabel; imageLabel-setScaledContents(true); text =new QTextEdit; QHBox
8、Layout *mainLayout =new QHBoxLayout(this); mainLayout-addWidget(imageLabel); mainLayout-addWidget(text);(6)主函數(shù)ImgProcessor類(lèi)聲明中的createActions()函數(shù)用于創(chuàng)建所有的動(dòng)作、createMenus()函數(shù)用于創(chuàng)建菜單、createToolBars()函數(shù)用于創(chuàng)建工具欄;接著聲明實(shí)現(xiàn)主窗口所需的各個(gè)元素,包括菜單、工具欄及各個(gè)動(dòng)作等;最后聲明用到的槽函數(shù),打開(kāi)“imgprocessor.h”文件,添加如下代碼。【綜合實(shí)例】文本編輯器(7)下面是主窗口構(gòu)造函數(shù)部分的
9、內(nèi)容,構(gòu)造函數(shù)主要實(shí)現(xiàn)窗體的初始化,打開(kāi)“imgprocessor.cpp”文件,添加如下代碼:ImgProcessor:ImgProcessor(QWidget *parent) : QMainWindow(parent) setWindowTitle(tr(Easy Word);/設(shè)置窗體標(biāo)題 showWidget =new ShowWidget(this);/(a) setCentralWidget(showWidget); /* 創(chuàng)建動(dòng)作、菜單、工具欄的函數(shù) */ createActions(); createMenus(); createToolBars(); if(img.load
10、(image.png) /在imageLabel對(duì)象中放置圖像 showWidget-imageLabel-setPixmap(QPixmap:fromImage(img); 其中,(a) showWidget =new ShowWidget(this)、setCentralWidget(showWidget):創(chuàng)建放置圖像QLabel和文本編輯框QTextEdit的QWidget對(duì)象showWidget,并將該QWidget對(duì)象設(shè)置為中心部件。1動(dòng)作(Action)的實(shí)現(xiàn)2菜單(Menus)的實(shí)現(xiàn)3工具欄(ToolBars)的實(shí)現(xiàn)03菜單與工具欄的實(shí)現(xiàn)1動(dòng)作(Action)的實(shí)現(xiàn)以下是實(shí)現(xiàn)基
11、本文件操作的動(dòng)作(Action)的代碼。其中,(a) openFileAction =new QAction(QIcon(open.png),tr(打開(kāi)),this):在創(chuàng)建“打開(kāi)文件”動(dòng)作的同時(shí),指定了此動(dòng)作使用的圖標(biāo)、名稱(chēng)及父窗口。(b) openFileAction-setShortcut(tr(Ctrl+O):設(shè)置此動(dòng)作的組合鍵為Ctrl+O。(c) openFileAction-setStatusTip(tr(打開(kāi)一個(gè)文件):設(shè)定了狀態(tài)欄顯示,當(dāng)鼠標(biāo)光標(biāo)移至此動(dòng)作對(duì)應(yīng)的菜單條目或工具欄按鈕上時(shí),在狀態(tài)欄上顯示“打開(kāi)一個(gè)文件”的提示。在創(chuàng)建動(dòng)作時(shí),也可不指定圖標(biāo)。這類(lèi)動(dòng)作通常只在菜單中
12、出現(xiàn),而不在工具欄上使用。以下是實(shí)現(xiàn)打印文本和圖像、圖像縮放、旋轉(zhuǎn)和鏡像的動(dòng)作(Action)的代碼(位于ImgProcessor:createActions()方法中)。2菜單(Menus)的實(shí)現(xiàn)在實(shí)現(xiàn)了各個(gè)動(dòng)作之后,需要將它們通過(guò)菜單、工具欄或快捷鍵的方式體現(xiàn)出來(lái),以下是菜單的實(shí)現(xiàn)函數(shù)createMenus()代碼。其中,在實(shí)現(xiàn)文件菜單中,(a) fileMenu =menuBar()-addMenu(tr(文件):直接調(diào)用QMainWindow的menuBar()函數(shù)即可得到主窗口的菜單欄指針,再調(diào)用菜單欄QMenuBar的addMenu()函數(shù),即可完成在菜單欄中插入一個(gè)新菜單file
13、Menu,fileMenu為一個(gè)QMenu類(lèi)對(duì)象。(b) fileMenu-addAction():調(diào)用QMenu的addAction()函數(shù)在菜單中加入菜單條目“打開(kāi)”“新建”“打印文本”“打印圖像”。類(lèi)似地,實(shí)現(xiàn)縮放菜單、旋轉(zhuǎn)菜單和鏡像菜單。3工具欄(ToolBars)的實(shí)現(xiàn)接下來(lái)實(shí)現(xiàn)相對(duì)應(yīng)的工具欄createToolBars(),主窗口的工具欄上可以有多個(gè)工具條,通常采用一個(gè)菜單對(duì)應(yīng)一個(gè)工具條的方式,也可根據(jù)需要進(jìn)行工具條的劃分。其中,在文件工具條中,(a) fileTool =addToolBar(File):直接調(diào)用QMainWindow的addToolBar()函數(shù)即可獲得主窗口的
14、工具條對(duì)象,每新增一個(gè)工具條調(diào)用一次addToolBar()函數(shù),賦予不同的名稱(chēng),即可在主窗口中新增一個(gè)工具條。(b) fileTool-addAction():調(diào)用QToolBar的addAction()函數(shù)在工具條中插入屬于本工具條的動(dòng)作。類(lèi)似地,實(shí)現(xiàn)“編輯工具條”“旋轉(zhuǎn)工具條”“撤銷(xiāo)和重做工具條”。工具條的顯示可以由用戶(hù)進(jìn)行選擇,在工具欄上單擊鼠標(biāo)右鍵將彈出工具條顯示的選擇菜單,用戶(hù)對(duì)需要顯示的工具條進(jìn)行選擇即可。工具條是一個(gè)可移動(dòng)的窗口,它可停靠的區(qū)域由QToolBar的allowAreas決定,包括Qt:LeftToolBarArea、Qt:RightToolBarArea、Qt:T
15、opToolBarArea、Qt:BottomToolBarArea和Qt:AllToolBarAreas。默認(rèn)為Qt:AllToolBarAreas,啟動(dòng)后默認(rèn)出現(xiàn)于主窗口的頂部??赏ㄟ^(guò)調(diào)用setAllowAreas()函數(shù)來(lái)指定工具條可??康膮^(qū)域,例如: fileTool-setAllowedAreas(Qt:TopToolBarArea|Qt:LeftToolBarArea);此函數(shù)限定文件工具條只可出現(xiàn)在主窗口的頂部或左側(cè)。工具條也可通過(guò)調(diào)用setMovable()函數(shù)設(shè)定可移動(dòng)性,例如: fileTool-setMovable(false);指定文件工具條不可移動(dòng),只出現(xiàn)于主窗口的頂
16、部。3工具欄(ToolBars)的實(shí)現(xiàn)選擇“構(gòu)建”“構(gòu)建項(xiàng)目 ImageProcessor”菜單項(xiàng),將程序中用到的圖片保存到項(xiàng)目D:QtCH5CH501build-ImageProcessor-Desktop_Qt_5_11_1_MinGW_32bit-Debug目錄下,運(yùn)行程序,效果如圖5.3所示。第5章 Qt 5主窗口Qt 5文件操作功能01新 建 文 件新 建 文 件在圖5.3中,當(dāng)單擊“文件”“新建”命令時(shí),沒(méi)有任何反應(yīng)。下面將介紹如何實(shí)現(xiàn)新建一個(gè)空白文件的功能。(1)打開(kāi)“imgprocessor.h”頭文件,添加“protected slots:”變量:protected slot
17、s: void ShowNewFile();(2)在createActions()函數(shù)的“新建動(dòng)作”最后添加事件關(guān)聯(lián):connect(NewFileAction,SIGNAL(triggered(),this,SLOT(ShowNewFile();(3)實(shí)現(xiàn)新建文件功能的函數(shù)ShowNewFile()如下:void ImgProcessor:ShowNewFile() ImgProcessor *newImgProcessor =new ImgProcessor; newImgProcessor-show();新 建 文 件(4)運(yùn)行程序,單擊“文件”“新建”命令或單擊工具欄上的 按鈕,彈出新
18、的文件編輯窗口,如圖5.4所示。02打 開(kāi) 文 件打 開(kāi) 文 件利用標(biāo)準(zhǔn)文件對(duì)話框QFileDialog打開(kāi)一個(gè)已經(jīng)存在的文件。若當(dāng)前中央窗體中已有打開(kāi)的文件,則在一個(gè)新的窗口中打開(kāi)選定的文件;若當(dāng)前中央窗體是空白的,則在當(dāng)前中央窗體中打開(kāi)。(1)在“imgprocessor.h”頭文件中添加“protected slots:”變量: void ShowOpenFile();(2)在createActions()函數(shù)的“打開(kāi)動(dòng)作”最后添加事件關(guān)聯(lián): connect(openFileAction,SIGNAL(triggered(),this,SLOT(ShowOpenFile();打 開(kāi) 文
19、件(3)實(shí)現(xiàn)打開(kāi)文件功能的函數(shù)ShowOpenFile()如下:void ImgProcessor:ShowOpenFile() fileName =QFileDialog:getOpenFileName(this); if(!fileName.isEmpty() if(showWidget-text-document()-isEmpty() loadFile(fileName); else ImgProcessor *newImgProcessor =new ImgProcessor; newImgProcessor-show(); newImgProcessor-loadFile(file
20、Name); 打 開(kāi) 文 件其中,loadFile()函數(shù)的實(shí)現(xiàn)如下,該函數(shù)利用QFile和QTextStream完成具體讀取文件內(nèi)容的工作:void ImgProcessor:loadFile(QString filename) printf(file name:%sn,filename.data(); QFile file(filename); if(file.open(QIODevice:ReadOnly|QIODevice:Text) QTextStream textStream(&file); while(!textStream.atEnd() showWidget-text-app
21、end(textStream.readLine(); printf(read linen); printf(endn); 打 開(kāi) 文 件在此僅詳細(xì)說(shuō)明標(biāo)準(zhǔn)文件對(duì)話框QFileDialog的getOpenFileName()靜態(tài)函數(shù)各個(gè)參數(shù)的作用,其他文件對(duì)話框類(lèi)中相關(guān)的靜態(tài)函數(shù)的參數(shù)有與其類(lèi)似之處。QString QFileDialog:getOpenFileName(QWidget* parent=0,/定義標(biāo)準(zhǔn)文件對(duì)話框的父窗口const QString & caption=QString(),/定義標(biāo)準(zhǔn)文件對(duì)話框的標(biāo)題名const QString & dir=QString(),/(a)
22、 const QString & filter=QString(),/(b)QString * selectedFilter=0,/用戶(hù)選擇過(guò)濾器通過(guò)此參數(shù)返回Options options=0);其中,(a) const QString & dir=QString():指定了默認(rèn)的目錄,若此參數(shù)帶有文件名,則文件將是默認(rèn)選中的文件。(b) const QString & filter=QString():此參數(shù)對(duì)文件類(lèi)型進(jìn)行過(guò)濾,只有與過(guò)濾器匹配的文件類(lèi)型才顯示,可以同時(shí)指定多種過(guò)濾方式供用戶(hù)選擇,多種過(guò)濾器之間用“;”隔開(kāi)。打 開(kāi) 文 件(4)在該源文件的開(kāi)始部分添加如下頭文件:#incl
23、ude #include #include (5)運(yùn)行程序,單擊“文件”“打開(kāi)”命令或單擊工具欄上的 按鈕,彈出“打開(kāi)”對(duì)話框,如圖5.5(a)所示。選擇某個(gè)文件,單擊“打開(kāi)”按鈕,文本編輯框中將顯示出該文件的內(nèi)容,如圖5.5(b)所示。1文本打印2圖像打印03打 印 文 件1文本打印打印文本在文本編輯工作中經(jīng)常使用,下面將介紹如何實(shí)現(xiàn)文本打印功能。標(biāo)準(zhǔn)打印對(duì)話框效果如圖5.6所示。1文本打印如圖5.6所示,QPrintDialog標(biāo)準(zhǔn)打印對(duì)話框提供了打印機(jī)的選擇、配置功能,并允許用戶(hù)改變文檔有關(guān)的設(shè)置,如頁(yè)面范圍、打印份數(shù)等。具體實(shí)現(xiàn)步驟如下。(1)在“imgprocessor.h”頭文件中
24、添加“protected slots:”變量: void ShowPrintText();(2)在createActions()函數(shù)的“打印文本動(dòng)作”最后添加事件關(guān)聯(lián): connect(PrintTextAction,SIGNAL(triggered(),this,SLOT(ShowPrintText();1文本打?。?)實(shí)現(xiàn)打印文本功能的函數(shù)ShowPrintText ()如下:void ImgProcessor:ShowPrintText() QPrinter printer;/新建一個(gè)QPrinter對(duì)象 QPrintDialog printDialog(&printer,this);/
25、(a) if(printDialog.exec()/(b) /獲得QTextEdit對(duì)象的文檔 QTextDocument *doc =showWidget-text-document(); doc-print(&printer);/打印 其中,(a) QPrintDialog printDialog(&printer,this):創(chuàng)建一個(gè)QPrintDialog對(duì)象,參數(shù)為QPrinter對(duì)象。(b) if(printDialog.exec():判斷標(biāo)準(zhǔn)打印對(duì)話框顯示后用戶(hù)是否單擊“打印”按鈕。若單擊“打印”按鈕,則相關(guān)打印屬性將可以通過(guò)創(chuàng)建QPrintDialog對(duì)象時(shí)使用的QPrinte
26、r對(duì)象獲得;若用戶(hù)單擊“取消”按鈕,則不執(zhí)行后續(xù)的打印操作。1文本打?。?)在該源文件的開(kāi)始部分添加如下頭文件:#include #include (5)運(yùn)行程序,單擊“文件”“打印文本”命令或工具欄上的 按鈕,彈出標(biāo)準(zhǔn)打印對(duì)話框,如圖5.6所示。2圖像打印打印圖像實(shí)際上是在一個(gè)QPaintDevice中畫(huà)圖,與平常在QWidget、QPixmap和QImage中畫(huà)圖相同,都是創(chuàng)建一個(gè)QPainter對(duì)象進(jìn)行畫(huà)圖,只是打印使用的是QPrinter,QPrinter本質(zhì)上也是一個(gè)繪圖設(shè)備QPaintDevice。下面將介紹如何實(shí)現(xiàn)圖像打印功能。(1)在“imgprocessor.h”頭文件中添加
27、“protected slots:”變量: void ShowPrintImage();(2)在createActions()函數(shù)的“打印圖像動(dòng)作”最后添加事件關(guān)聯(lián): connect(PrintImageAction,SIGNAL(triggered(),this,SLOT(ShowPrintImage();2圖像打印(3)實(shí)現(xiàn)打印圖像功能的函數(shù)ShowPrintImage ()如下:void ImgProcessor:ShowPrintImage() QPrinter printer;/新建一個(gè)QPrinter對(duì)象 QPrintDialog printDialog(&printer,this
28、);/(a) if(printDialog.exec()/(b) QPainter painter(&printer);/(c) QRect rect =painter.viewport();/獲得QPainter對(duì)象的視圖矩形區(qū)域 QSize size = img.size();/獲得圖像的大小 /* 按照?qǐng)D形的比例大小重新設(shè)置視圖矩形區(qū)域 */ size.scale(rect.size(),Qt:KeepAspectRatio); painter.setViewport(rect.x(),rect.y(),size.width(),size.height(); painter.setWin
29、dow(img.rect();/設(shè)置QPainter窗口大小為圖像的大小 painter.drawImage(0,0,img);/打印圖像 2圖像打印其中,(a) QPrintDialog printDialog(&printer,this):創(chuàng)建一個(gè)QPrintDialog對(duì)象,參數(shù)為QPrinter對(duì)象。(b) if(printDialog.exec():判斷打印對(duì)話框顯示后用戶(hù)是否單擊“打印”按鈕。若單擊“打印”按鈕,則相關(guān)打印屬性將可以通過(guò)創(chuàng)建QPrintDialog對(duì)象時(shí)使用的QPrinter對(duì)象獲得;若用戶(hù)單擊“取消”按鈕,則不執(zhí)行后續(xù)的打印操作。(c) QPainter pain
30、ter(&printer):創(chuàng)建一個(gè)QPainter對(duì)象,并指定繪圖設(shè)備為一個(gè)QPrinter對(duì)象。(4)在該源文件的開(kāi)始部分添加如下頭文件: #include (5)運(yùn)行程序,單擊“文件”“打印圖像”命令或單擊工具欄上的 按鈕,彈出標(biāo)準(zhǔn)打印對(duì)話框,顯示效果如圖5.6所示。第5章 Qt 5主窗口Qt 5圖像坐標(biāo)變換01縮 放 功 能縮 放 功 能(1)在“imgprocessor.h”頭文件中添加“protected slots:”變量: void ShowZoomIn();(2)在createActions()函數(shù)的“放大動(dòng)作”最后添加事件關(guān)聯(lián): connect(zoomInAction,S
31、IGNAL(triggered(),this,SLOT(ShowZoomIn();(3)實(shí)現(xiàn)圖形放大功能的函數(shù)ShowZoomIn()如下:void ImgProcessor:ShowZoomIn() if(img.isNull()/有效性判斷 return; QMatrix martix;/聲明一個(gè)QMatrix類(lèi)的實(shí)例 martix.scale(2,2);/(a) img = img.transformed(martix); /重新設(shè)置顯示圖形 showWidget-imageLabel-setPixmap(QPixmap:fromImage(img);其中,(a) martix.scal
32、e(2,2)、img = img.transformed(martix):按照2倍比例對(duì)水平和垂直方向進(jìn)行放大,并將當(dāng)前顯示的圖形按照該坐標(biāo)矩陣進(jìn)行轉(zhuǎn)換。void ImgProcessor:ShowZoomOut() if(img.isNull() return; QMatrix matrix; matrix.scale(0.5,0.5);/(a) img = img.transformed(matrix); showWidget-imageLabel-setPixmap(QPixmap:fromImage(img);縮 放 功 能(4)在“imgprocessor.h”頭文件中添加“prot
33、ected slots:”變量: void ShowZoomOut();(5)在createActions()函數(shù)的“縮小動(dòng)作”最后添加事件關(guān)聯(lián): connect(zoomOutAction,SIGNAL(triggered(),this,SLOT(ShowZoomOut();(6)實(shí)現(xiàn)圖形縮小功能的函數(shù)ShowZoomOut()如下:縮 放 功 能(7)運(yùn)行程序,單擊“編輯”“放大”命令或單擊工具欄上的 按鈕,圖像放大效果如圖5.7所示。02旋 轉(zhuǎn) 功 能旋 轉(zhuǎn) 功 能ShowRotate90()函數(shù)實(shí)現(xiàn)的是圖形的旋轉(zhuǎn),此函數(shù)實(shí)現(xiàn)坐標(biāo)的逆時(shí)針旋轉(zhuǎn)90。具體實(shí)現(xiàn)步驟如下。(1)在“imgpro
34、cessor.h”頭文件中添加“protected slots:”變量: void ShowRotate90();(2)在createActions()函數(shù)的“旋轉(zhuǎn)90”最后添加事件關(guān)聯(lián): connect(rotate90Action,SIGNAL(triggered(),this,SLOT(ShowRotate90();(3)ShowRotate90()函數(shù)的具體實(shí)現(xiàn)代碼如下:void ImgProcessor:ShowRotate90() if(img.isNull() return; QMatrix matrix; matrix.rotate(90); img = img.transfo
35、rmed(matrix); showWidget-imageLabel-setPixmap(QPixmap:fromImage(img);旋 轉(zhuǎn) 功 能(4)在“imgprocessor.h”頭文件中添加“protected slots:”變量:void ShowRotate180();void ShowRotate270();(5)在createActions()函數(shù)的“旋轉(zhuǎn)180”“旋轉(zhuǎn)270”最后分別添加事件關(guān)聯(lián):connect(rotate180Action,SIGNAL(triggered(),this,SLOT(ShowRotate180();connect(rotate270Ac
36、tion,SIGNAL(triggered(),this,SLOT(ShowRotate270();旋 轉(zhuǎn) 功 能(6)ShowRotate180()、ShowRotate270()函數(shù)的具體實(shí)現(xiàn)代碼如下:void ImgProcessor:ShowRotate180() if(img.isNull() return; QMatrix matrix; matrix.rotate(180); img = img.transformed(matrix); showWidget-imageLabel-setPixmap(QPixmap:fromImage(img);void ImgProcessor
37、:ShowRotate270() if(img.isNull() return; QMatrix matrix; matrix.rotate(270); img = img.transformed(matrix); showWidget-imageLabel-setPixmap(QPixmap:fromImage(img);旋 轉(zhuǎn) 功 能(7)運(yùn)行程序,單擊“旋轉(zhuǎn)”“旋轉(zhuǎn)90”命令或單擊工具欄上的 按鈕,圖像旋轉(zhuǎn)90的效果如圖5.8所示。03鏡 像 功 能鏡 像 功 能通過(guò)QImage:mirrored(bool horizontal,bool vertical)實(shí)現(xiàn)圖形的鏡像功能,參數(shù)hor
38、izontal和vertical分別指定了鏡像的方向。具體實(shí)現(xiàn)步驟如下。(1)在“imgprocessor.h”頭文件中添加“protected slots:”變量:void ShowMirrorVertical();void ShowMirrorHorizontal();(2)在createActions()函數(shù)的“縱向鏡像”“橫向鏡像”最后分別添加事件關(guān)聯(lián):connect(mirrorVerticalAction,SIGNAL(triggered(),this,SLOT(ShowMirrorVertical();connect(mirrorHorizontalAction,SIGNAL(t
39、riggered(),this,SLOT(ShowMirrorHorizontal();鏡 像 功 能(3)ShowMirrorVertical ()、ShowMirrorHorizontal ()函數(shù)的具體實(shí)現(xiàn)代碼如下:void ImgProcessor:ShowMirrorVertical() if(img.isNull() return; img=img.mirrored(false,true); showWidget-imageLabel-setPixmap(QPixmap:fromImage(img);void ImgProcessor:ShowMirrorHorizontal()
40、if(img.isNull() return; img=img.mirrored(true,false); showWidget-imageLabel-setPixmap(QPixmap:fromImage(img);鏡 像 功 能(4)此時(shí)運(yùn)行程序,單擊“鏡像”“橫向鏡像”命令,蝴蝶翅膀底部的陰影從右邊移到左邊,橫向鏡像效果如圖5.9所示。第5章 Qt 5主窗口Qt 5文本編輯功能Qt 5文本編輯功能文本編輯各類(lèi)之間的劃分與關(guān)系如圖5.10所示。任何一個(gè)文本編輯的程序都要用QTextEdit作為輸入文本的容器,在它里面輸入可編輯文本由QTextDocument作為載體,而用來(lái)表示QTextD
41、ocument的元素的QTextBlock、QTextList、QTextFrame等是QTextDocument的不同表現(xiàn)形式,可以表示為字符串、段落、列表、表格或圖片等。Qt 5文本編輯功能實(shí)現(xiàn)文本編輯的具體操作步驟如下。(1)在“imgprocessor.h”頭文件中添加“private:”變量:QLabel *fontLabel1; /字體設(shè)置項(xiàng)QFontComboBox *fontComboBox;QLabel *fontLabel2;QComboBox *sizeComboBox;QToolButton *boldBtn;QToolButton *italicBtn;QToolBu
42、tton *underlineBtn;QToolButton *colorBtn;QToolBar *fontToolBar; /字體工具欄(2)在“imgprocessor.h”頭文件中添加“protected slots:”變量:void ShowFontComboBox(QString comboStr);void ShowSizeSpinBox(QString spinValue);void ShowBoldBtn();void ShowItalicBtn();void ShowUnderlineBtn();void ShowColorBtn();void ShowCurrentFor
43、matChanged(const QTextCharFormat &fmt);Qt 5文本編輯功能(3)在相對(duì)應(yīng)的構(gòu)造函數(shù)中,在語(yǔ)句“setCentralWidget(showWidget);”與語(yǔ)句“createActions();”之間添加如下代碼。(4)在該構(gòu)造函數(shù)的最后部分添加相關(guān)的事件關(guān)聯(lián):connect(fontComboBox,SIGNAL(activated(QString), this,SLOT(ShowFontComboBox(QString);connect(sizeComboBox,SIGNAL(activated(QString), this,SLOT(ShowSiz
44、eSpinBox(QString);connect(boldBtn,SIGNAL(clicked(),this,SLOT(ShowBoldBtn();connect(italicBtn,SIGNAL(clicked(),this,SLOT(ShowItalicBtn();connect(underlineBtn,SIGNAL(clicked(),this,SLOT(ShowUnderlineBtn();connect(colorBtn,SIGNAL(clicked(),this,SLOT(ShowColorBtn();connect(showWidget-text,SIGNAL(current
45、CharFormatChanged(QTextCharFormat&),this,SLOT(ShowCurrentFormatChanged(QTextCharFormat&);Qt 5文本編輯功能(5)在相對(duì)應(yīng)的工具欄createToolBars()函數(shù)中添加如下代碼:/字體工具條fontToolBar =addToolBar(Font);fontToolBar-addWidget(fontLabel1);fontToolBar-addWidget(fontComboBox);fontToolBar-addWidget(fontLabel2);fontToolBar-addWidget(si
46、zeComboBox);fontToolBar-addSeparator();fontToolBar-addWidget(boldBtn);fontToolBar-addWidget(italicBtn);fontToolBar-addWidget(underlineBtn);fontToolBar-addSeparator();fontToolBar-addWidget(colorBtn);調(diào)用QFontComboBox的setFontFilters接口可過(guò)濾只在下拉列表框中顯示某一類(lèi)字體,默認(rèn)情況下為QFontComboBox:AllFonts列出所有字體。01設(shè) 置 字 體設(shè) 置 字 體
47、完成設(shè)置選定文字字體的函數(shù)ShowFontComboBox()代碼如下:void ImgProcessor:ShowFontComboBox(QString comboStr)/設(shè)置字體 QTextCharFormat fmt;/創(chuàng)建一個(gè)QTextCharFormat對(duì)象 fmt.setFontFamily(comboStr);/選擇的字體名稱(chēng)設(shè)置給QTextCharFormat對(duì)象 mergeFormat(fmt); /將新的格式應(yīng)用到光標(biāo)選區(qū)內(nèi)的字符前面介紹過(guò),所有對(duì)于QTextDocument進(jìn)行的修改都通過(guò)QTextCursor類(lèi)來(lái)完成,具體代碼如下:void ImgProcessor
48、:mergeFormat(QTextCharFormat format) QTextCursor cursor =showWidget-text-textCursor();/獲得編輯框中的光標(biāo) if(!cursor.hasSelection()/(a) cursor.select(QTextCursor:WordUnderCursor); cursor.mergeCharFormat(format);/(b) showWidget-text-mergeCurrentCharFormat(format);/(c)設(shè) 置 字 體其中,(a) if(!cursor.hasSelection()、cu
49、rsor.select(QTextCursor:WordUnderCursor):若光標(biāo)沒(méi)有高亮選區(qū),則將光標(biāo)所在處的詞作為選區(qū),由前后空格或“,”“.”等標(biāo)點(diǎn)符號(hào)區(qū)分詞。(b) cursor.mergeCharFormat(format):調(diào)用QTextCursor的mergeCharFormat()函數(shù)將參數(shù)format所表示的格式應(yīng)用到光標(biāo)所在處的字符上。(c) showWidget-text-mergeCurrentCharFormat(format):調(diào)用QTextEdit的merge CurrentChar Format()函數(shù)將格式應(yīng)用到選區(qū)內(nèi)的所有字符上。02設(shè) 置 字 號(hào)設(shè)
50、置 字 號(hào)設(shè)置選定文字字號(hào)大小的ShowSizeSpinBox()函數(shù)代碼如下:void ImgProcessor:ShowSizeSpinBox(QString spinValue)/設(shè)置字號(hào) QTextCharFormat fmt; fmt.setFontPointSize(spinValue.toFloat(); showWidget-text-mergeCurrentCharFormat(fmt);03設(shè)置文字加粗設(shè)置文字加粗設(shè)置選定文字為加粗顯示的ShowBoldBtn()函數(shù)代碼如下:void ImgProcessor:ShowBoldBtn() /設(shè)置文字顯示加粗 QTextCh
51、arFormat fmt; fmt.setFontWeight(boldBtn-isChecked()?QFont:Bold:QFont: Normal); showWidget-text-mergeCurrentCharFormat(fmt);其中,調(diào)用QTextCharFormat的setFontWeight()函數(shù)設(shè)置粗細(xì)值,若檢測(cè)到“加粗”按鈕被按下,則設(shè)置字符的Weight值為QFont:Bold,可直接設(shè)為75;反之,則設(shè)為QFont:Normal。文字的粗細(xì)值由QFont:Weight表示,它是一個(gè)整型值,取值的范圍可為099,有5個(gè)預(yù)置值,分別為QFont:Light(25)、
52、QFont:Normal(50)、QFont:DemiBold(63)、QFont:Bold(75)和QFont:Black(87),通常在QFont:Normal和QFont:Bold之間轉(zhuǎn)換。04設(shè)置文字斜體設(shè)置文字斜體設(shè)置選定文字為斜體顯示的ShowItalicBtn()函數(shù)代碼如下:void ImgProcessor:ShowItalicBtn()/設(shè)置文字顯示斜體 QTextCharFormat fmt; fmt.setFontItalic(italicBtn-isChecked(); showWidget-text-mergeCurrentCharFormat(fmt);05設(shè)置文
53、字加下畫(huà)線設(shè)置文字加下畫(huà)線在選定文字下方加下畫(huà)線的ShowUnderlineBtn()函數(shù)代碼如下:void ImgProcessor:ShowUnderlineBtn()/設(shè)置文字加下畫(huà)線 QTextCharFormat fmt; fmt.setFontUnderline(underlineBtn-isChecked(); showWidget-text-mergeCurrentCharFormat(fmt);06設(shè)置文字顏色設(shè)置文字顏色設(shè)置選定文字顏色的ShowColorBtn()函數(shù)代碼如下:void ImgProcessor:ShowColorBtn()/設(shè)置文字顏色QColor co
54、lor=QColorDialog:getColor(Qt:red,this);/(a)if(color.isValid() QTextCharFormat fmt; fmt.setForeground(color); showWidget-text-mergeCurrentCharFormat(fmt); 在“imgprocessor.cpp”文件的開(kāi)頭添加聲明:#include #include 設(shè)置文字顏色標(biāo)準(zhǔn)顏色對(duì)話框QColorDialog類(lèi)的使用:QColor getColor( const QColor& initial=Qt:white, QWidget* parent=0);
55、第1個(gè)參數(shù)指定了選中的顏色,默認(rèn)為白色。通過(guò)QColor:isValid()可以判斷用戶(hù)選擇的顏色是否有效,若用戶(hù)單擊“取消”(Cancel)按鈕,則QColor:isValid()返回false。第2個(gè)參數(shù)定義了標(biāo)準(zhǔn)顏色對(duì)話框的父窗口。07設(shè)置字符格式設(shè)置字符格式當(dāng)光標(biāo)所在處的字符格式發(fā)生變化時(shí)調(diào)用此槽函數(shù),函數(shù)根據(jù)新的字符格式將工具欄上各個(gè)格式控件的顯示更新。void ImgProcessor:ShowCurrentFormatChanged(const QTextCharFormat &fmt)fontComboBox-setCurrentIndex(fontComboBox-findT
56、ext(fmt .fontFamily(); sizeComboBox-setCurrentIndex(sizeComboBox-findText( QString:number(fmt.fontPointSize(); boldBtn-setChecked(fmt.font().bold(); italicBtn-setChecked(fmt.fontItalic(); underlineBtn-setChecked(fmt.fontUnderline();第5章 Qt 5主窗口Qt 5排版功能Qt 5排版功能具體實(shí)現(xiàn)步驟如下。(1)在“imgprocessor.h”頭文件中添加“priva
57、te:”變量:QLabel *listLabel; /排序設(shè)置項(xiàng)QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *rightAction;QAction *centerAction;QAction *justifyAction;QToolBar *listToolBar; /排序工具欄(2)在“imgprocessor.h”頭文件中添加“protected slots:”變量:void ShowList(int);void ShowAlignment(QAction *act);void Show
58、CursorPositionChanged();Qt 5排版功能(3)在相對(duì)應(yīng)的構(gòu)造函數(shù)中,在語(yǔ)句“setCentralWidget(showWidget);”與語(yǔ)句“createActions();”之間添加如下代碼:/排序listLabel =new QLabel(tr(排序); listComboBox =new QComboBox;listComboBox-addItem(Standard);listComboBox-addItem(QTextListFormat:ListDisc);listComboBox-addItem(QTextListFormat:ListCircle);li
59、stComboBox-addItem(QTextListFormat:ListSquare);listComboBox-addItem(QTextListFormat:ListDecimal);listComboBox-addItem(QTextListFormat:ListLowerAlpha);listComboBox-addItem(QTextListFormat:ListUpperAlpha);listComboBox-addItem(QTextListFormat:ListLowerRoman);listComboBox-addItem(QTextListFormat:ListUpp
60、erRoman);(4)在構(gòu)造函數(shù)的最后添加相關(guān)的事件關(guān)聯(lián):connect(listComboBox,SIGNAL(activated(int),this,SLOT(ShowList(int);connect(showWidget-text-document(),SIGNAL(undoAvailable(bool), redoAction,SLOT(setEnabled(bool);connect(showWidget-text-document(),SIGNAL(redoAvailable(bool), redoAction,SLOT(setEnabled(bool);connect(sho
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024藝術(shù)學(xué)校教室租賃與藝術(shù)展覽合作合同3篇
- 二零二五年度風(fēng)力發(fā)電設(shè)備安裝與運(yùn)營(yíng)合同3篇
- 2025年度貓咪品種引進(jìn)與銷(xiāo)售代理合同4篇
- 二零二四年光伏發(fā)電項(xiàng)目爆破鉆孔合同
- 南昌市2025年度新建住宅買(mǎi)賣(mài)合同
- 二零二五版環(huán)保設(shè)施建設(shè)與運(yùn)營(yíng)合同3篇
- 2025年度餐飲企業(yè)知識(shí)產(chǎn)權(quán)保護(hù)合同18篇
- 年度超高純氣體的純化設(shè)備戰(zhàn)略市場(chǎng)規(guī)劃報(bào)告
- 2025版智能交通信號(hào)系統(tǒng)零星維修施工合同4篇
- 二零二五年度車(chē)輛抵押擔(dān)保信托合同范本3篇
- 稱(chēng)量與天平培訓(xùn)試題及答案
- 超全的超濾與納濾概述、基本理論和應(yīng)用
- 2020年醫(yī)師定期考核試題與答案(公衛(wèi)專(zhuān)業(yè))
- 2022年中國(guó)育齡女性生殖健康研究報(bào)告
- 各種靜脈置管固定方法
- 消防報(bào)審驗(yàn)收程序及表格
- 教育金規(guī)劃ppt課件
- 呼吸機(jī)波形分析及臨床應(yīng)用
- 常用緊固件選用指南
- 私人借款協(xié)議書(shū)新編整理版示范文本
- 自薦書(shū)(彩色封面)
評(píng)論
0/150
提交評(píng)論