




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Qt Creator快速入門快速入門第第2版版第第5 5章章 應(yīng)用程序主窗口應(yīng)用程序主窗口(3課時) 這一章開始接觸應(yīng)用程序主窗口的相關(guān)內(nèi)容。對于日常見到的應(yīng)用程這一章開始接觸應(yīng)用程序主窗口的相關(guān)內(nèi)容。對于日常見到的應(yīng)用程序而言,它們中的許多都是基于主窗口的,主窗口中包含了菜單欄、序而言,它們中的許多都是基于主窗口的,主窗口中包含了菜單欄、工具欄、狀態(tài)欄和中心區(qū)域等。本章會詳細(xì)介紹主窗口的每一個部分,工具欄、狀態(tài)欄和中心區(qū)域等。本章會詳細(xì)介紹主窗口的每一個部分,還會涉及到資源管理、富文本處理、拖放操作和文檔打印等相關(guān)內(nèi)容。還會涉及到資源管理、富文本處理、拖放操作和文檔打印等相關(guān)內(nèi)容。 在在Qt
2、Qt中提供了以中提供了以QMainWindowQMainWindow類為核心的主窗口框架,它包含了類為核心的主窗口框架,它包含了眾多相關(guān)的類:眾多相關(guān)的類:主主 要要 內(nèi)內(nèi) 容容n5.1 主窗口框架(第主窗口框架(第1課時)課時)n5.2 富文本處理(第富文本處理(第2課時)課時)n5.3 拖放操作(第拖放操作(第3課時)課時)n5.4 打印文檔(第打印文檔(第3課時)課時)n5.5 小結(jié)(第小結(jié)(第3課時)課時)5.1 主窗口框架主窗口框架n菜單欄和工具欄菜單欄和工具欄n使用資源系統(tǒng)使用資源系統(tǒng)n中心部件中心部件nDock部件部件n狀態(tài)欄狀態(tài)欄n自定義菜單自定義菜單 主窗口為建立應(yīng)用程序用戶
3、界面提供了一個框架,主窗口為建立應(yīng)用程序用戶界面提供了一個框架,QtQt提供了提供了QMainWindowQMainWindow和和與其相關(guān)的一些類來進行主窗口的管理。與其相關(guān)的一些類來進行主窗口的管理。QMainWindowQMainWindow類擁有自己的布局:類擁有自己的布局:菜單欄(菜單欄(QMenuBar)。菜)。菜單欄包含了一個下拉菜單項的單欄包含了一個下拉菜單項的列表,這些菜單項由列表,這些菜單項由QAction動作類實現(xiàn)。菜單欄位于主窗動作類實現(xiàn)。菜單欄位于主窗口的頂部,一個主窗口只能有口的頂部,一個主窗口只能有一個菜單欄。一個菜單欄。工具欄(工具欄(QToolBar)。工)。
4、工具欄一般用于顯示一些常用具欄一般用于顯示一些常用的菜單項目,它也可以插入的菜單項目,它也可以插入其他窗口部件,并且工具欄其他窗口部件,并且工具欄是可以移動的。一個主窗口是可以移動的。一個主窗口可以擁有多個工具欄??梢該碛卸鄠€工具欄。中心部件(中心部件(Central Widget)。在主窗口的中心)。在主窗口的中心區(qū)域可以放入一個窗口部件區(qū)域可以放入一個窗口部件作為中心部件,它是應(yīng)用程作為中心部件,它是應(yīng)用程序的主要功能實現(xiàn)區(qū)域。一序的主要功能實現(xiàn)區(qū)域。一個主窗口只能擁有一個中心個主窗口只能擁有一個中心部件。部件。Dock部件部件(QDockWidget)。)。Dock部部件常被稱為停靠窗口
5、,因為它件常被稱為??看翱?,因為它可以??吭谥行牟考乃闹?。可以停靠在中心部件的四周。它用來放置一些部件來實現(xiàn)一它用來放置一些部件來實現(xiàn)一些功能,就像個工具箱一樣。些功能,就像個工具箱一樣。一個主窗口可以擁有多個一個主窗口可以擁有多個Dock部件。部件。狀態(tài)欄(狀態(tài)欄(QStatusBar)。)。狀態(tài)欄用于顯示程序的一些狀態(tài)欄用于顯示程序的一些狀態(tài)信息,它在主窗口的最狀態(tài)信息,它在主窗口的最底部。一個主窗口只能擁有底部。一個主窗口只能擁有一個狀態(tài)欄。一個狀態(tài)欄。在設(shè)計器中給菜單欄、工具欄添加動作在設(shè)計器中給菜單欄、工具欄添加動作 在在Qt Creator中雙擊項目中的中雙擊項目中的.ui文件進
6、入設(shè)計模式。文件進入設(shè)計模式。n添加菜單,雙擊左上角的添加菜單,雙擊左上角的“在這里輸入在這里輸入”,修改為,修改為“文件文件(&F)”,這里要使用,這里要使用英文半角的括號,英文半角的括號,“&F”被稱為加速鍵,表明程序運行時,可以按下被稱為加速鍵,表明程序運行時,可以按下Alt+F鍵鍵來激活該菜單。修改完成后,按下回車鍵,并在彈出的下拉菜單中,將第一來激活該菜單。修改完成后,按下回車鍵,并在彈出的下拉菜單中,將第一項改為項改為“新建文件新建文件(&N)”并按下回車鍵。并按下回車鍵。n這時可以看到在下面的這時可以看到在下面的Action編輯器中已經(jīng)有了編輯器中已經(jīng)有了
7、“新建文件新建文件”動作。動作。n在這里用鼠標(biāo)點擊該動作,將其拖入菜單欄下面的工具欄中。在這里用鼠標(biāo)點擊該動作,將其拖入菜單欄下面的工具欄中。 菜單欄菜單欄nQMenuBarQMenuBar類提供了一個水平的菜單欄,在類提供了一個水平的菜單欄,在QMainWindowQMainWindow中可以直接獲取它的中可以直接獲取它的默認(rèn)存在的菜單欄,向其中添加默認(rèn)存在的菜單欄,向其中添加QMenuQMenu類型的菜單對象,然后向彈出菜單中添類型的菜單對象,然后向彈出菜單中添加加QActionQAction類型的動作對象。類型的動作對象。n在在QMenuQMenu中還提供了間隔器,可以在設(shè)計器中向添加菜
8、單那樣直接添加間隔器,中還提供了間隔器,可以在設(shè)計器中向添加菜單那樣直接添加間隔器,或者在代碼中使用或者在代碼中使用addSeparator()addSeparator()函數(shù)來添加,它是一條水平線,可以將菜函數(shù)來添加,它是一條水平線,可以將菜單分成幾組,使得布局很整齊。單分成幾組,使得布局很整齊。n在應(yīng)用程序中很多普通的命令都是通過菜單來實現(xiàn)的,而我們也希望能將這在應(yīng)用程序中很多普通的命令都是通過菜單來實現(xiàn)的,而我們也希望能將這些菜單命令放到工具欄中,以方便使用。些菜單命令放到工具欄中,以方便使用。QActionQAction就是這樣一種命令動作,就是這樣一種命令動作,它可以同時放在菜單和工
9、具欄中。一個它可以同時放在菜單和工具欄中。一個QActionQAction動作包含了一個圖標(biāo),一個動作包含了一個圖標(biāo),一個菜單顯示文本,一個快捷鍵,一個狀態(tài)欄顯示文本,一個菜單顯示文本,一個快捷鍵,一個狀態(tài)欄顯示文本,一個“Whats ThisWhats This?”顯示文本和一個工具提示文本。這些都可以在構(gòu)建顯示文本和一個工具提示文本。這些都可以在構(gòu)建QActionQAction類對象時在構(gòu)造類對象時在構(gòu)造函數(shù)中指定。函數(shù)中指定。n另外還可以設(shè)置另外還可以設(shè)置QActionQAction的的checkablecheckable屬性,如果指定這個動作的屬性,如果指定這個動作的checkable
10、checkable為為truetrue,那么當(dāng)選中這個菜單時就會在它的前面顯示,那么當(dāng)選中這個菜單時就會在它的前面顯示“”之類的表示選中之類的表示選中狀態(tài)的符號,如果該菜單有圖標(biāo),那么就會用線框?qū)D標(biāo)圍住,用來表示該狀態(tài)的符號,如果該菜單有圖標(biāo),那么就會用線框?qū)D標(biāo)圍住,用來表示該動作被選中了。動作被選中了。代碼方式添加菜單代碼方式添加菜單/ 添加編輯菜單添加編輯菜單QMenu *editMenu = ui-menuBar-addMenu(tr(編輯編輯(&E);/ 添加打開菜單添加打開菜單 QAction *action_Open = editMenu-addAction( QIco
11、n(“./images/open.png),tr(打開文件打開文件(&O);/ 設(shè)置快捷鍵設(shè)置快捷鍵action_Open-setShortcut(QKeySequence(Ctrl+O); / 在工具欄中添加動作在工具欄中添加動作ui-mainToolBar-addAction(action_Open); 工具欄工具欄n工具欄工具欄QToolBar類提供了一個包含了一組控件的可以移動的面板。類提供了一個包含了一組控件的可以移動的面板。在上面已經(jīng)看到可以將在上面已經(jīng)看到可以將QAction對象添加到工具欄中,它默認(rèn)只是顯對象添加到工具欄中,它默認(rèn)只是顯示一個動作的圖標(biāo),這個可以在示一個
12、動作的圖標(biāo),這個可以在QToolBar的屬性欄中進行更改。的屬性欄中進行更改。n在設(shè)計器中可以查看在設(shè)計器中可以查看QToolBar的屬性欄,其中的屬性欄,其中toolButtonStyle屬性屬性設(shè)置圖標(biāo)和相應(yīng)文本的顯示及其相對位置等;設(shè)置圖標(biāo)和相應(yīng)文本的顯示及其相對位置等;movabel屬性設(shè)置狀態(tài)屬性設(shè)置狀態(tài)欄是否可以移動;欄是否可以移動;allowedArea設(shè)置允許??康奈恢茫辉O(shè)置允許??康奈恢茫籭consize屬性屬性設(shè)置圖標(biāo)的大??;設(shè)置圖標(biāo)的大小;floatable屬性設(shè)置是否可以懸浮。屬性設(shè)置是否可以懸浮。在工具欄中添加部件在工具欄中添加部件QToolButton *toolB
13、tn = new QToolButton(this); / 創(chuàng)建創(chuàng)建QToolButtontoolBtn-setText(tr(顏色顏色);QMenu *colorMenu = new QMenu(this); / 創(chuàng)建一個菜單創(chuàng)建一個菜單colorMenu-addAction(tr(紅色紅色);colorMenu-addAction(tr(綠色綠色);toolBtn-setMenu(colorMenu); / 添加菜單添加菜單toolBtn-setPopupMode(QToolButton:MenuButtonPopup); / 設(shè)置彈出模式設(shè)置彈出模式ui-mainToolBar-addW
14、idget(toolBtn); / 向工具欄添加向工具欄添加QToolButton按鈕按鈕QSpinBox *spinBox = new QSpinBox(this); / 創(chuàng)建創(chuàng)建QSpinBoxui-mainToolBar-addWidget(spinBox); / 向工具欄添加向工具欄添加QSpinBox部件部件資源系統(tǒng)資源系統(tǒng) Qt資源系統(tǒng)是一個獨立于平臺的(跟使用的操作系統(tǒng)無關(guān))資源系統(tǒng)是一個獨立于平臺的(跟使用的操作系統(tǒng)無關(guān))用于在可執(zhí)行文件中存儲二進制文件的機制。用于在可執(zhí)行文件中存儲二進制文件的機制。n可以讓需要的文件(圖片、文本等)包含到程序編程生成可以讓需要的文件(圖片、文
15、本等)包含到程序編程生成的可執(zhí)行文件(例如的可執(zhí)行文件(例如exe文件)中。文件)中。n保證了程序中使用的文件不會丟失、不會因為存放路徑而保證了程序中使用的文件不會丟失、不會因為存放路徑而導(dǎo)致程序運行錯誤。導(dǎo)致程序運行錯誤。在在Qt Creator中添加資源中添加資源n第一步,添加第一步,添加Qt資源文件。往項目中添加新文件,選擇資源文件。往項目中添加新文件,選擇Qt分類中的分類中的Qt資源文件,文件資源文件,文件名稱改為名稱改為“myImage”,其他選項默認(rèn)即可。,其他選項默認(rèn)即可。n第二步,添加資源。建立好資源文件后會默認(rèn)進入資源管理界面,就是新建的第二步,添加資源。建立好資源文件后會默
16、認(rèn)進入資源管理界面,就是新建的myImage.qrc文件中?,F(xiàn)在先到項目文件夾文件中。現(xiàn)在先到項目文件夾myMainWindow中新建一個名為中新建一個名為“images”的文件夾,并在其中放入兩張圖標(biāo)圖片,比如這里放入了一個的文件夾,并在其中放入兩張圖標(biāo)圖片,比如這里放入了一個“new.png”和一個和一個“open.png”圖片。(注意:圖片。(注意:Qt的資源系統(tǒng)要求資源文件必須放在與的資源系統(tǒng)要求資源文件必須放在與qrc文件同文件同級或子級目錄下,如果放在其他地方,當(dāng)添加資源時會提示將文件復(fù)制到有效的位級或子級目錄下,如果放在其他地方,當(dāng)添加資源時會提示將文件復(fù)制到有效的位置。)置。)
17、n 然后回到然后回到Qt Creator中,在資源管理界面,按下中,在資源管理界面,按下“添加添加”按鈕,選擇按鈕,選擇“添加前添加前綴綴”,然后將屬性欄中的前綴改為,然后將屬性欄中的前綴改為“/myImage”,再點擊,再點擊“添加添加”按鈕,選擇按鈕,選擇“添加添加文件文件”,在彈出的對話框中進入到前面新建的,在彈出的對話框中進入到前面新建的images文件夾中,選中那兩張圖片,點文件夾中,選中那兩張圖片,點擊打開即可。這時擊打開即可。這時myImage.qrc文件中就出現(xiàn)了添加的圖片的列表。最后按下文件中就出現(xiàn)了添加的圖片的列表。最后按下Ctrl+S快捷鍵,保存對文件的修改(注意:這一點
18、很重要,如果沒有保存,在下面使用圖片快捷鍵,保存對文件的修改(注意:這一點很重要,如果沒有保存,在下面使用圖片時將看不到圖片)。時將看不到圖片)。 n第三步,使用圖片。在設(shè)計模式第三步,使用圖片。在設(shè)計模式Action編輯器中雙擊編輯器中雙擊“新建文件新建文件”動作,這動作,這時會彈出編輯動作對話框。在其中將對象名稱改為時會彈出編輯動作對話框。在其中將對象名稱改為“action_New”,工具提,工具提示改為示改為“新建文件新建文件”,然后按下圖標(biāo)后面的按鈕,進入選擇資源界面。,然后按下圖標(biāo)后面的按鈕,進入選擇資源界面。n第一次進入該界面還沒有顯示可用的資源,需要按下左上角的重新加載綠色第一次
19、進入該界面還沒有顯示可用的資源,需要按下左上角的重新加載綠色箭頭圖標(biāo),這時圖片資源就顯示出來了。這里選擇箭頭圖標(biāo),這時圖片資源就顯示出來了。這里選擇new.png圖片,然后按下圖片,然后按下確定按鈕。確定按鈕。n如果在編寫代碼時使用如果在編寫代碼時使用new.png圖片,那么就可以將其路徑指定為圖片,那么就可以將其路徑指定為“:/myImage/images/new.png”, 前綴前綴“/myImage”是添加資源時手動設(shè)是添加資源時手動設(shè)置的。置的。資源文件介紹資源文件介紹n在使用資源時添加的在使用資源時添加的qrcqrc資源文件其實是一個資源文件其實是一個XMLXML格式的文本文件,進入
20、編輯格式的文本文件,進入編輯模式,在模式,在myImage.qrcmyImage.qrc文件上點擊鼠標(biāo)右鍵,選擇文件上點擊鼠標(biāo)右鍵,選擇“用用打開打開”“Plain “Plain Text Editor”Text Editor”,這時就會看到,這時就會看到myImage.qrcmyImage.qrc的內(nèi)容如下:的內(nèi)容如下: images/new.png images/new.png images/open.png images/open.png 在這里指明了文件類型為在這里指明了文件類型為RCCRCC,表明是,表明是QtQt資源文件。然后是資源前綴,在下面羅資源文件。然后是資源前綴,在下面羅列
21、了添加的圖片的路徑。列了添加的圖片的路徑。 n當(dāng)往項目中添加了一個資源文件時,會自動往工程文件當(dāng)往項目中添加了一個資源文件時,會自動往工程文件myMainW中添加代碼:中添加代碼:RESOURCES += RESOURCES += myImage.qrc myImage.qrc這表明項目中使用了資源文件這表明項目中使用了資源文件myImage.qrc。 中心部件中心部件n在主窗口的中心區(qū)域可以放置一個中心部件,它一般是一個編輯器或者瀏覽在主窗口的中心區(qū)域可以放置一個中心部件,它一般是一個編輯器或者瀏覽器。這里支持單文檔部件,也支持多文檔部件。一般的,會在這里放置一個器。這里支
22、持單文檔部件,也支持多文檔部件。一般的,會在這里放置一個部件,然后使用布局管理器使其充滿整個中心區(qū)域,并可以隨著窗口的大小部件,然后使用布局管理器使其充滿整個中心區(qū)域,并可以隨著窗口的大小變化而改變大小。例如在設(shè)計模式中,往中心區(qū)域拖入一個變化而改變大小。例如在設(shè)計模式中,往中心區(qū)域拖入一個Text Edit,然后,然后點擊界面,按下點擊界面,按下Ctrl+G使其處于一個柵格布局中。使其處于一個柵格布局中。 效果如下。效果如下。Dock部件部件nQDockWidgetQDockWidget類提供了這樣一個部件,它可以??吭陬愄峁┝诉@樣一個部件,它可以??吭赒MainWindowQMainWin
23、dow中也可以懸中也可以懸浮起來作為桌面頂級窗口,我們稱它為浮起來作為桌面頂級窗口,我們稱它為DockDock部件或者??看翱凇2考蛘咄?看翱凇ockDock部件一部件一般用于存放其他一些部件來實現(xiàn)一些特殊功能,就像一個工具箱一樣。它在般用于存放其他一些部件來實現(xiàn)一些特殊功能,就像一個工具箱一樣。它在主窗口中可以??吭谥行牟考乃闹?,也可以懸浮起來,被拖動到任意的地主窗口中可以??吭谥行牟考乃闹埽部梢詰腋∑饋?,被拖動到任意的地方,還可以被關(guān)閉或隱藏起來。一個方,還可以被關(guān)閉或隱藏起來。一個DockDock部件包含一個標(biāo)題欄和一個內(nèi)容區(qū)部件包含一個標(biāo)題欄和一個內(nèi)容區(qū)域,可以向域,可以向D
24、ockDock部件中放入任何部件。部件中放入任何部件。 n例如:例如:在設(shè)計模式中向中心區(qū)域拖入一個在設(shè)計模式中向中心區(qū)域拖入一個Dock Widget部件,然后再向部件,然后再向Dock中隨意拖入幾個部件,比如這里拖入一個中隨意拖入幾個部件,比如這里拖入一個Push Button和一個和一個Font Combo Box。然后在。然后在dockWidget的屬性欄中更改其的屬性欄中更改其windowTitle為為“工具箱工具箱”。狀態(tài)欄狀態(tài)欄nQStatusBar類提供了一個水平條,用來顯示狀態(tài)信息。類提供了一個水平條,用來顯示狀態(tài)信息。QMainWindow中默中默認(rèn)提供了一個狀態(tài)欄。認(rèn)提供
25、了一個狀態(tài)欄。n狀態(tài)信息可以被分為三類:臨時信息,如一般的提示信息;正常信息,如顯狀態(tài)信息可以被分為三類:臨時信息,如一般的提示信息;正常信息,如顯示頁數(shù)和行號;永久信息,如顯示版本號或者日期??梢允褂檬卷摂?shù)和行號;永久信息,如顯示版本號或者日期??梢允褂胹howMessage()函數(shù)來顯示一個臨時消息,它會出現(xiàn)在狀態(tài)欄的最左邊。一函數(shù)來顯示一個臨時消息,它會出現(xiàn)在狀態(tài)欄的最左邊。一般用般用addWidget()函數(shù)添加一個函數(shù)添加一個QLabel到狀態(tài)欄上用于顯示正常信息,它會到狀態(tài)欄上用于顯示正常信息,它會生成到狀態(tài)欄的最左邊,可能會被臨時消息所掩蓋。如果要顯示永久信息,生成到狀態(tài)欄的最左
26、邊,可能會被臨時消息所掩蓋。如果要顯示永久信息,要使用要使用addPermanentWidget()函數(shù)來添加一個如函數(shù)來添加一個如QLabel一樣的可以顯示信一樣的可以顯示信息的部件,它會生成在狀態(tài)欄的最右端,不會被臨時消息所掩蓋。息的部件,它會生成在狀態(tài)欄的最右端,不會被臨時消息所掩蓋。n在狀態(tài)欄的最右端,還有一個在狀態(tài)欄的最右端,還有一個QSizeGrip部件,用來調(diào)整窗口的大小,可以部件,用來調(diào)整窗口的大小,可以使用使用setSizeGripEnabled()函數(shù)來禁用它。函數(shù)來禁用它。 目前的設(shè)計器中還不支持直接向狀態(tài)欄中拖放部件,所以需要使用代碼來生目前的設(shè)計器中還不支持直接向狀態(tài)
27、欄中拖放部件,所以需要使用代碼來生成。例如:成。例如:/ 顯示臨時消息,顯示顯示臨時消息,顯示2000毫秒即毫秒即2秒鐘秒鐘ui-statusBar-showMessage(tr(歡迎使用多文檔編輯器歡迎使用多文檔編輯器), 2000);/ 創(chuàng)建標(biāo)簽,設(shè)置標(biāo)簽樣式并顯示信息,將其以永久部件的形式添加到狀態(tài)欄創(chuàng)建標(biāo)簽,設(shè)置標(biāo)簽樣式并顯示信息,將其以永久部件的形式添加到狀態(tài)欄QLabel *permanent = new QLabel(this); permanent-setFrameStyle(QFrame:Box | QFrame:Sunken); permanent-setText(); u
28、i-statusBar-addPermanentWidget(permanent);此時運行程序,可以發(fā)現(xiàn)此時運行程序,可以發(fā)現(xiàn)“歡迎使用多文檔編輯器歡迎使用多文檔編輯器”字符串在顯示一會兒后字符串在顯示一會兒后就自動消失了,而就自動消失了,而“”一直顯示在狀態(tài)欄最右端。一直顯示在狀態(tài)欄最右端。 自定義菜單自定義菜單Qt中的中的QWidgetAction類可以實現(xiàn)自定義菜單的功能。為了實現(xiàn)自類可以實現(xiàn)自定義菜單的功能。為了實現(xiàn)自定義菜單,需要新建一個類,它繼承自定義菜單,需要新建一個類,它繼承自QWidgetAction類,并且在其類,并且在其中重新實現(xiàn)中重新實現(xiàn)createWidget()函
29、數(shù)。函數(shù)。 自學(xué)內(nèi)容:自學(xué)內(nèi)容:寫一個程序,實現(xiàn)了這樣一個菜單:它包含一個標(biāo)簽和一寫一個程序,實現(xiàn)了這樣一個菜單:它包含一個標(biāo)簽和一個行編輯器,可以在行編輯器中輸入字符串,然后按下回車鍵,就可個行編輯器,可以在行編輯器中輸入字符串,然后按下回車鍵,就可以自動將字符串輸入到中心部件文本編輯器中。以自動將字符串輸入到中心部件文本編輯器中。 5.2 富文本處理富文本處理 富文本(富文本(Rich TextRich Text)或者叫做富文本格式,簡單來說就是在)或者叫做富文本格式,簡單來說就是在文檔中可以使用多種格式,比如字體顏色、圖片和表格等等。它文檔中可以使用多種格式,比如字體顏色、圖片和表格等等
30、。它是與純文本(是與純文本(Plain TextPlain Text)相對而言的,比如)相對而言的,比如WindowsWindows上的記事本上的記事本就是純文本編輯器,而就是純文本編輯器,而WordWord就是富文本編輯器。就是富文本編輯器。n富文本文檔結(jié)構(gòu)富文本文檔結(jié)構(gòu) n文本塊文本塊 n表格、列表與圖片表格、列表與圖片 n查找功能查找功能 n語法高亮與語法高亮與HTML HTML 在在Qt中提供了對富文本處理的支持。中提供了對富文本處理的支持。Qt中對富文本的處理分為了編輯操作和中對富文本的處理分為了編輯操作和只讀操作兩種方式。只讀操作兩種方式。n編輯操作是使用基于光標(biāo)的一些接口函數(shù),這
31、樣更好的模擬了用戶的編輯操編輯操作是使用基于光標(biāo)的一些接口函數(shù),這樣更好的模擬了用戶的編輯操作,更加容易理解,而且不會丟失底層的文檔框架;作,更加容易理解,而且不會丟失底層的文檔框架;n而對于文檔結(jié)構(gòu)的概覽,使用了只讀的分層次的接口函數(shù),它們有利于文檔而對于文檔結(jié)構(gòu)的概覽,使用了只讀的分層次的接口函數(shù),它們有利于文檔的檢索和輸出。的檢索和輸出。 對于文檔的讀取和編輯要使用不同方面的兩組接口。對于文檔的讀取和編輯要使用不同方面的兩組接口。n文檔的光標(biāo)主要基于文檔的光標(biāo)主要基于QTextCursor類類n文檔的框架主要基于文檔的框架主要基于QTextDocument類。類。 一個富文本文檔的結(jié)構(gòu)被
32、分為了幾種元素來表示,分別是框架一個富文本文檔的結(jié)構(gòu)被分為了幾種元素來表示,分別是框架(QTextFrame)、文本塊()、文本塊(QTextBlock)、表格()、表格(QTextTable)和列表)和列表(QTextList)。)。 每種元素的格式又使用相應(yīng)的每種元素的格式又使用相應(yīng)的format類來表示,它們分別是框架格式類來表示,它們分別是框架格式(QTextFrameFormat)、文本塊格式()、文本塊格式(QTextBlockFormat)、表格格式)、表格格式(QTextTableFormat)和列表格式()和列表格式(QTextListFormat),這些格式一般),這些格式
33、一般在編輯文檔時使用,所以它們常和在編輯文檔時使用,所以它們常和QTextCursor類配合使用。類配合使用。 富文本文檔結(jié)構(gòu)富文本文檔結(jié)構(gòu) 因為因為QTextEdit類就是一個富文本編輯器,所以在構(gòu)建類就是一個富文本編輯器,所以在構(gòu)建QTextEdit類的對類的對象時就已經(jīng)構(gòu)建了一個象時就已經(jīng)構(gòu)建了一個QTextDocument類對象和一個類對象和一個QTextCursor類對象,類對象,只需調(diào)用它們進行相應(yīng)的操作即可。只需調(diào)用它們進行相應(yīng)的操作即可。 一個空的文檔包含了一個根框架(一個空的文檔包含了一個根框架(Root frame),這個根框架又包含了),這個根框架又包含了一個空的文本塊(
34、一個空的文本塊(Block)??蚣軐⒁粋€文檔分為多個部分,在根框架里可)??蚣軐⒁粋€文檔分為多個部分,在根框架里可以再添加文本塊、子框架和表格等。以再添加文本塊、子框架和表格等。 設(shè)置根框架設(shè)置根框架QTextDocument *document = ui-textEdit-document(); /獲取文檔對象獲取文檔對象QTextFrame *rootFrame = document-rootFrame(); / 獲取根框架獲取根框架QTextFrameFormat format; / 創(chuàng)建框架格式創(chuàng)建框架格式format.setBorderBrush(Qt:red); / 邊界顏色邊界顏
35、色format.setBorder(3); / 邊界寬度邊界寬度rootFrame-setFrameFormat(format); / 框架使用格式框架使用格式添加子框架添加子框架QTextFrameFormat frameFormat;frameFormat.setBackground(Qt:lightGray); / 設(shè)置背景顏色設(shè)置背景顏色frameFormat.setMargin(10); / 設(shè)置邊距設(shè)置邊距frameFormat.setPadding(5); / 設(shè)置填襯設(shè)置填襯frameFormat.setBorder(2);/設(shè)置邊框樣式設(shè)置邊框樣式frameFormat.se
36、tBorderStyle(QTextFrameFormat:BorderStyle_Dotted); QTextCursor cursor = ui-textEdit-textCursor(); / 獲取光標(biāo)獲取光標(biāo)cursor.insertFrame(frameFormat); / 在光標(biāo)處插入框架在光標(biāo)處插入框架文本塊文本塊文本塊文本塊QTextBlock類為文本文檔類為文本文檔QTextDocument提供了一個文本片提供了一個文本片段(段(QTextFragment)的容器。)的容器。 一個文本塊可以看做是一個段落,但是它不能使用回車換行,因為一一個文本塊可以看做是一個段落,但是它不能
37、使用回車換行,因為一個回車換行就表示創(chuàng)建一個新的文本塊。個回車換行就表示創(chuàng)建一個新的文本塊。QTextBlock提供了只讀接提供了只讀接口,它是前面提到的文檔分層次的接口的一部分,如果口,它是前面提到的文檔分層次的接口的一部分,如果QTextFrame看做是一層,那么其中的看做是一層,那么其中的QTextBlock就是另一層。就是另一層。 文本塊的格式由文本塊的格式由QTextBlockFormat類來處理,它主要涉及對齊方式,類來處理,它主要涉及對齊方式,文本塊四周的邊白,縮進等內(nèi)容。而文本塊中的文本內(nèi)容的格式,比文本塊四周的邊白,縮進等內(nèi)容。而文本塊中的文本內(nèi)容的格式,比如字體大小、加粗、
38、下劃線等內(nèi)容,則由如字體大小、加粗、下劃線等內(nèi)容,則由QTextCharFormat類來設(shè)類來設(shè)置。置。 遍歷框架遍歷框架 QTextDocument *document = ui-textEdit-document(); QTextFrame *frame = document-rootFrame(); QTextFrame:iterator it; / 建立建立QTextFrame類的迭代器類的迭代器 for (it = frame-begin(); !(it.atEnd(); +it) QTextFrame *childFrame = it.currentFrame();/ 獲取當(dāng)前框架
39、的指針獲取當(dāng)前框架的指針 QTextBlock childBlock = it.currentBlock(); / 獲取當(dāng)前文本塊獲取當(dāng)前文本塊 if (childFrame) qDebug() frame; else if (childBlock.isValid() qDebug() block: textEdit-document(); QTextBlock block = document-firstBlock(); / 獲取文檔的第一個文本塊獲取文檔的第一個文本塊 for (int i = 0; i blockCount(); i+) qDebug() tr(文本塊文本塊%1,文本塊首
40、行行號為,文本塊首行行號為:%2,長度為,長度為:%3,內(nèi)容為:內(nèi)容為:) .arg(i).arg(block.firstLineNumber().arg(block.length() textEdit-textCursor(); QTextBlockFormat blockFormat; / 文本塊格式文本塊格式 blockFormat.setAlignment(Qt:AlignCenter); / 水平居中水平居中 cursor.insertBlock(blockFormat); / 使用文本塊格式使用文本塊格式 QTextCharFormat charFormat; / 字符格式字符格式
41、 charFormat.setBackground(Qt:lightGray); / 背景色背景色 charFormat.setForeground(Qt:blue); / 字體顏色字體顏色 / 使用宋體,使用宋體,12號,加粗,傾斜號,加粗,傾斜 charFormat.setFont(QFont(tr(宋體宋體), 12, QFont:Bold, true); charFormat.setFontUnderline(true); / 使用下劃線使用下劃線 cursor.setCharFormat(charFormat); / 使用字符格式使用字符格式 cursor.insertText(tr
42、(測試字體測試字體); / 插入文本插入文本表格、列表和圖片表格、列表和圖片n插入表格插入表格 QTextCursor cursor = ui-textEdit-textCursor(); QTextTableFormat format; / 表格格式表格格式 format.setCellSpacing(2); / 表格外邊白表格外邊白 format.setCellPadding(10); / 表格內(nèi)邊白表格內(nèi)邊白 cursor.insertTable(2, 2, format); / 插入插入2行行2列表格列表格n插入列表插入列表 QTextListFormat format; / 列表格式
43、列表格式 format.setStyle(QTextListFormat:ListDecimal); / 數(shù)字編號數(shù)字編號 ui-textEdit-textCursor().insertList(format);n插入圖片插入圖片 QTextImageFormat format; / 圖片格式圖片格式 format.setName(logo.png); / 圖片路徑圖片路徑 ui-textEdit-textCursor().insertImage(format);查找功能查找功能n查找文本查找文本 QDialog *dlg = new QDialog(this); / 創(chuàng)建對話框創(chuàng)建對話框 l
44、ineEdit = new QLineEdit(dlg); / 創(chuàng)建行編輯器創(chuàng)建行編輯器 QPushButton *btn = new QPushButton(dlg); / 創(chuàng)建按鈕創(chuàng)建按鈕 btn-setText(tr(查找下一個查找下一個); connect(btn,SIGNAL(clicked(),this,SLOT(findNext(); / 關(guān)聯(lián)信號和槽關(guān)聯(lián)信號和槽 QVBoxLayout *layout = new QVBoxLayout; / 創(chuàng)建垂直布局管理器創(chuàng)建垂直布局管理器 layout-addWidget(lineEdit); / 添加部件添加部件 layout-add
45、Widget(btn); dlg-setLayout(layout); / 在對話框中使用布局管理器在對話框中使用布局管理器 dlg-show();n查找下一個查找下一個 QString string = lineEdit-text(); / 使用查找函數(shù)查找指定字符串,查找方式為向后查找使用查找函數(shù)查找指定字符串,查找方式為向后查找 bool isfind = ui-textEdit-find(string, QTextDocument:FindBackward); if(isfind) / 如果查找成功,輸出字符串所在行和列的編號如果查找成功,輸出字符串所在行和列的編號 qDebug()
46、textEdit-textCursor().blockNumber() .arg(ui-textEdit-textCursor().columnNumber(); 語法高亮語法高亮 在使用在使用Qt Creator編輯代碼時可以發(fā)現(xiàn),輸入關(guān)鍵字時會顯示不同的顏色,編輯代碼時可以發(fā)現(xiàn),輸入關(guān)鍵字時會顯示不同的顏色,這就是所謂的語法高亮。這就是所謂的語法高亮。 在在Qt的富文本處理中提供了的富文本處理中提供了QSyntaxHighlighter類來實現(xiàn)語法高亮。為了實類來實現(xiàn)語法高亮。為了實現(xiàn)這個功能,需要創(chuàng)建現(xiàn)這個功能,需要創(chuàng)建QSyntaxHighlighter類的子類,然后重新實現(xiàn)類的子類,
47、然后重新實現(xiàn)highlightBlock()函數(shù),使用時直接將函數(shù),使用時直接將QTextDocument類對象指針作為其父類對象指針作為其父部件指針,這樣就可以自動調(diào)用部件指針,這樣就可以自動調(diào)用highlightBlock()函數(shù)了。函數(shù)了。 例如,自定義的類為例如,自定義的類為MySyntaxHighlighter,像這樣來使用:,像這樣來使用: highlighter = new MySyntaxHighlighter(ui-textEdit-document(); 這里創(chuàng)建了這里創(chuàng)建了MySyntaxHighlighter類的對象,并且使用編輯器的文檔對象指針作為其類的對象,并且使用
48、編輯器的文檔對象指針作為其參數(shù),這樣,每當(dāng)編輯器中的文本改變時都會調(diào)用參數(shù),這樣,每當(dāng)編輯器中的文本改變時都會調(diào)用highlightBlock()函數(shù)來設(shè)置語法函數(shù)來設(shè)置語法高亮。高亮。 重新實現(xiàn)重新實現(xiàn)highlightBlock()函數(shù):函數(shù): QTextCharFormat myFormat; / 字符格式字符格式 myFormat.setFontWeight(QFont:Bold); myFormat.setForeground(Qt:green); QString pattern = bcharb; / 要匹配的字符,這里是要匹配的字符,這里是“char”單詞單詞 QRegExp e
49、xpression(pattern); / 創(chuàng)建正則表達式創(chuàng)建正則表達式 int index = text.indexOf(expression); / 從位置從位置0開始匹配字符串開始匹配字符串 / 如果匹配成功,那么返回值為字符串的起始位置,它大于或等于如果匹配成功,那么返回值為字符串的起始位置,它大于或等于0 while (index = 0) int length = expression.matchedLength(); / 要匹配字符串的長度要匹配字符串的長度 setFormat(index, length, myFormat); / 對要匹配的字符串設(shè)置格式對要匹配的字符串設(shè)置格
50、式 index = text.indexOf(expression, index + length); / 繼續(xù)匹配繼續(xù)匹配 在這里主要是使用了正則表達式和在這里主要是使用了正則表達式和QString類的類的indexOf()函數(shù)來函數(shù)來進行字符串的匹配,如果匹配成功,則使用進行字符串的匹配,如果匹配成功,則使用QSyntaxHighlighter類的類的setFormat()函數(shù)來設(shè)置字符格式。函數(shù)來設(shè)置字符格式。 HTML 在富文本處理中還提供了對在富文本處理中還提供了對HTML子集的支持,可以在子集的支持,可以在QLabel或者或者QTextEdit添加文本時使用添加文本時使用HTML標(biāo)
51、簽或者標(biāo)簽或者CSS屬性,例如:屬性,例如: ui-textEdit-append(tr(使用使用HTML); 這里往編輯器中添加了文本,并且使用了這里往編輯器中添加了文本,并且使用了HTML標(biāo)簽,標(biāo)簽, 5.3 拖放操作拖放操作 對于一個實用的應(yīng)用程序,我們不僅希望能從文件菜單中打開一個對于一個實用的應(yīng)用程序,我們不僅希望能從文件菜單中打開一個文件,更希望可以通過拖動,直接將桌面上的文件拖入程序界面上文件,更希望可以通過拖動,直接將桌面上的文件拖入程序界面上來打開,就像可以將來打開,就像可以將.文件拖入文件拖入Qt CreatorQt Creator中來打開整個項目一中來打開整
52、個項目一樣。樣。QtQt中提供了強大的拖放機制,拖放操作分為拖動(中提供了強大的拖放機制,拖放操作分為拖動(DragDrag)和放)和放下(下(DropDrop)兩種操作。當(dāng)數(shù)據(jù)被拖動時會被存儲為)兩種操作。當(dāng)數(shù)據(jù)被拖動時會被存儲為MIME MIME (Multipurpose Internet Mail Extensions)(Multipurpose Internet Mail Extensions)類型,在類型,在QtQt中使用中使用QMimeDataQMimeData類來表示類來表示MIMEMIME類型的數(shù)據(jù),并使用類型的數(shù)據(jù),并使用QDragQDrag類來完成數(shù)據(jù)的類來完成數(shù)據(jù)的轉(zhuǎn)移
53、,而整個拖放操作都是在幾個鼠標(biāo)事件和拖放事件中完成的。轉(zhuǎn)移,而整個拖放操作都是在幾個鼠標(biāo)事件和拖放事件中完成的。n使用拖放打開文件使用拖放打開文件 n自定義拖放操作自定義拖放操作 使用拖放打開文件使用拖放打開文件例如:將桌面上的例如:將桌面上的txt文本文件拖入自己編寫的程序中來打開。使用拖放文本文件拖入自己編寫的程序中來打開。使用拖放需要聲明兩個函數(shù):需要聲明兩個函數(shù):protected: void dragEnterEvent(QDragEnterEvent *event); / 拖動進入事件拖動進入事件 void dropEvent(QDropEvent *event); / 放下事件放
54、下事件拖入操作拖入操作void MainWindow:dragEnterEvent(QDragEnterEvent *event) / 進入事件進入事件 if(event-mimeData()-hasUrls() / 數(shù)據(jù)中是否包含數(shù)據(jù)中是否包含URL event-acceptProposedAction(); / 如果是則接收動作如果是則接收動作 else event-ignore(); / 否則忽略該事件否則忽略該事件 當(dāng)鼠標(biāo)拖拽一個數(shù)據(jù)進入主窗口時,就會觸發(fā)當(dāng)鼠標(biāo)拖拽一個數(shù)據(jù)進入主窗口時,就會觸發(fā)dragEventEvent()事件處理函事件處理函數(shù),獲取其中的數(shù),獲取其中的MIME數(shù)據(jù)
55、,然后查看它是否包含數(shù)據(jù),然后查看它是否包含URL路徑,因為拖入的文路徑,因為拖入的文本文件實際上就是拖入了它的路徑,這就是本文件實際上就是拖入了它的路徑,這就是event-mimeData()-hasUrls()實現(xiàn)的功能。如果有這樣的數(shù)據(jù),就接收它,否則就忽略該事件。實現(xiàn)的功能。如果有這樣的數(shù)據(jù),就接收它,否則就忽略該事件。 放下操作放下操作void MainWindow:dropEvent(QDropEvent *event) / 放下事件放下事件 const QMimeData *mimeData = event-mimeData(); / 獲取獲取MIME數(shù)據(jù)數(shù)據(jù) if(mimeDa
56、ta-hasUrls() / 如果數(shù)據(jù)中包含如果數(shù)據(jù)中包含URL QList urlList = mimeData-urls(); / 獲取獲取URL列表列表 / 將其中第一個將其中第一個URL表示為本地文件路徑表示為本地文件路徑 QString fileName = urlList.at(0).toLocalFile(); if(!fileName.isEmpty() / 如果文件路徑不為空如果文件路徑不為空 QFile file(fileName); / 建立建立QFile對象并且以只讀方式打開該文件對象并且以只讀方式打開該文件 if(!file.open(QIODevice:ReadOn
57、ly) return; QTextStream in(&file); / 建立文本流對象建立文本流對象 ui-textEdit-setText(in.readAll(); / 將文件中所有內(nèi)容讀入編輯器將文件中所有內(nèi)容讀入編輯器 當(dāng)松開鼠標(biāo)左鍵,將數(shù)據(jù)放入主窗口時就會觸發(fā)當(dāng)松開鼠標(biāo)左鍵,將數(shù)據(jù)放入主窗口時就會觸發(fā)dropEvent()事件處理函數(shù),這事件處理函數(shù),這里獲取了里獲取了MIME數(shù)據(jù)中的數(shù)據(jù)中的URL列表,因為拖入的只有一個文件,所以獲取了列表列表,因為拖入的只有一個文件,所以獲取了列表中的第一個條目,并使用中的第一個條目,并使用toLocalFile()函數(shù)將它轉(zhuǎn)換為本地文
58、件路徑。然后使用函數(shù)將它轉(zhuǎn)換為本地文件路徑。然后使用QFile和和QTextStream將文件中的數(shù)據(jù)讀入編輯器中。將文件中的數(shù)據(jù)讀入編輯器中。MIME類型數(shù)據(jù)處理函數(shù)類型數(shù)據(jù)處理函數(shù) 在在QMimeData類中提供了幾個函數(shù)來方便的處理常見的類中提供了幾個函數(shù)來方便的處理常見的MIME數(shù)據(jù)數(shù)據(jù) :自定義拖放操作自定義拖放操作 下面以在窗口中拖動圖片為例,需要聲明以下幾個函數(shù):下面以在窗口中拖動圖片為例,需要聲明以下幾個函數(shù):protected: void mousePressEvent(QMouseEvent *event); / 鼠標(biāo)按下事件鼠標(biāo)按下事件 void dragEnterEve
59、nt(QDragEnterEvent *event); / 拖動進入事件拖動進入事件 void dragMoveEvent(QDragMoveEvent *event); / 拖動事件拖動事件 void dropEvent(QDropEvent *event); / 放下事件放下事件nmousePressEvent: 為拖動圖片做準(zhǔn)備工作,將圖片數(shù)據(jù)放到自定義的為拖動圖片做準(zhǔn)備工作,將圖片數(shù)據(jù)放到自定義的MIME類型中。類型中。ndragEnterEvent: 開始拖動,先判斷是否包含需要移動的類型。開始拖動,先判斷是否包含需要移動的類型。ndragMoveEvent:拖動過程。:拖動過程。n
60、dropEvent:放下圖片,創(chuàng)建新的圖片放到光標(biāo)處。:放下圖片,創(chuàng)建新的圖片放到光標(biāo)處。 當(dāng)鼠標(biāo)按下時當(dāng)鼠標(biāo)按下時會觸發(fā)鼠標(biāo)按下事件,進而執(zhí)行其處理函數(shù),在這里進行了一系列操作,大體上可以會觸發(fā)鼠標(biāo)按下事件,進而執(zhí)行其處理函數(shù),在這里進行了一系列操作,大體上可以分為六步。分為六步。n第一步,先獲取鼠標(biāo)指針?biāo)谔幍牟考闹羔?,將它強制轉(zhuǎn)換為第一步,先獲取鼠標(biāo)指針?biāo)谔幍牟考闹羔?,將它強制轉(zhuǎn)換為QLabel類型的指針,然后使用類型的指針,然后使用inherits()函數(shù)判斷它是否是函數(shù)判斷它是否是QLabel類型,如果不是則直接返回,不再進行下面的操作。類型,如果不是則直接返回,不再進行下面的操作。n第二步,因為不僅要在拖動的數(shù)據(jù)中包含圖片數(shù)據(jù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025授權(quán)運輸合同范本協(xié)議
- 2025醫(yī)院護士聘用合同
- 山東省聊城市臨清市2024-2025學(xué)年八年級下學(xué)期4月期中道德與法治試題(含答案)
- 球星代言球鞋合同協(xié)議
- 電商銷售授權(quán)合同協(xié)議
- 貓咪買賣寵物合同協(xié)議
- 玻璃墻窗簾采購合同協(xié)議
- 電梯維保合同中止協(xié)議
- 生豬養(yǎng)殖生豬收購合同協(xié)議
- 電柜組裝外協(xié)合同協(xié)議
- 排水管道非開挖預(yù)防性修復(fù)可行性研究報告
- 交通工程基礎(chǔ)習(xí)習(xí)題及參考答案
- 讀書知識競賽試題含答案
- 線路送出工程質(zhì)量創(chuàng)優(yōu)項目策劃書
- 企業(yè)全面戰(zhàn)略管理、年度經(jīng)營計劃、預(yù)算管理、績效管理
- 100T汽車吊性能表
- SOP0420201潔凈空調(diào)系統(tǒng)清潔消毒預(yù)防性維護保養(yǎng)操作規(guī)程報告
- 試樣切取和加工制備作業(yè)指導(dǎo)書
- 中國民主同盟入盟申請表(樣表)
- 數(shù)學(xué)分析簡明教程答案尹小玲鄧東皋
- 壁球館施工方案
評論
0/150
提交評論