




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Qt Creator快速入門快速入門第第2版版第第5 5章章 應用程序主窗口應用程序主窗口(3課時) 這一章開始接觸應用程序主窗口的相關內容。對于日常見到的應用程這一章開始接觸應用程序主窗口的相關內容。對于日常見到的應用程序而言,它們中的許多都是基于主窗口的,主窗口中包含了菜單欄、序而言,它們中的許多都是基于主窗口的,主窗口中包含了菜單欄、工具欄、狀態欄和中心區域等。本章會詳細介紹主窗口的每一個部分,工具欄、狀態欄和中心區域等。本章會詳細介紹主窗口的每一個部分,還會涉及到資源管理、富文本處理、拖放操作和文檔打印等相關內容。還會涉及到資源管理、富文本處理、拖放操作和文檔打印等相關內容。 在在Qt
2、Qt中提供了以中提供了以QMainWindowQMainWindow類為核心的主窗口框架,它包含了類為核心的主窗口框架,它包含了眾多相關的類:眾多相關的類:主主 要要 內內 容容n5.1 主窗口框架(第主窗口框架(第1課時)課時)n5.2 富文本處理(第富文本處理(第2課時)課時)n5.3 拖放操作(第拖放操作(第3課時)課時)n5.4 打印文檔(第打印文檔(第3課時)課時)n5.5 小結(第小結(第3課時)課時)5.1 主窗口框架主窗口框架n菜單欄和工具欄菜單欄和工具欄n使用資源系統使用資源系統n中心部件中心部件nDock部件部件n狀態欄狀態欄n自定義菜單自定義菜單 主窗口為建立應用程序用戶
3、界面提供了一個框架,主窗口為建立應用程序用戶界面提供了一個框架,QtQt提供了提供了QMainWindowQMainWindow和和與其相關的一些類來進行主窗口的管理。與其相關的一些類來進行主窗口的管理。QMainWindowQMainWindow類擁有自己的布局:類擁有自己的布局:菜單欄(菜單欄(QMenuBar)。菜)。菜單欄包含了一個下拉菜單項的單欄包含了一個下拉菜單項的列表,這些菜單項由列表,這些菜單項由QAction動作類實現。菜單欄位于主窗動作類實現。菜單欄位于主窗口的頂部,一個主窗口只能有口的頂部,一個主窗口只能有一個菜單欄。一個菜單欄。工具欄(工具欄(QToolBar)。工)。
4、工具欄一般用于顯示一些常用具欄一般用于顯示一些常用的菜單項目,它也可以插入的菜單項目,它也可以插入其他窗口部件,并且工具欄其他窗口部件,并且工具欄是可以移動的。一個主窗口是可以移動的。一個主窗口可以擁有多個工具欄。可以擁有多個工具欄。中心部件(中心部件(Central Widget)。在主窗口的中心)。在主窗口的中心區域可以放入一個窗口部件區域可以放入一個窗口部件作為中心部件,它是應用程作為中心部件,它是應用程序的主要功能實現區域。一序的主要功能實現區域。一個主窗口只能擁有一個中心個主窗口只能擁有一個中心部件。部件。Dock部件部件(QDockWidget)。)。Dock部部件常被稱為停靠窗口
5、,因為它件常被稱為停靠窗口,因為它可以停靠在中心部件的四周。可以停靠在中心部件的四周。它用來放置一些部件來實現一它用來放置一些部件來實現一些功能,就像個工具箱一樣。些功能,就像個工具箱一樣。一個主窗口可以擁有多個一個主窗口可以擁有多個Dock部件。部件。狀態欄(狀態欄(QStatusBar)。)。狀態欄用于顯示程序的一些狀態欄用于顯示程序的一些狀態信息,它在主窗口的最狀態信息,它在主窗口的最底部。一個主窗口只能擁有底部。一個主窗口只能擁有一個狀態欄。一個狀態欄。在設計器中給菜單欄、工具欄添加動作在設計器中給菜單欄、工具欄添加動作 在在Qt Creator中雙擊項目中的中雙擊項目中的.ui文件進
6、入設計模式。文件進入設計模式。n添加菜單,雙擊左上角的添加菜單,雙擊左上角的“在這里輸入在這里輸入”,修改為,修改為“文件文件(&F)”,這里要使用,這里要使用英文半角的括號,英文半角的括號,“&F”被稱為加速鍵,表明程序運行時,可以按下被稱為加速鍵,表明程序運行時,可以按下Alt+F鍵鍵來激活該菜單。修改完成后,按下回車鍵,并在彈出的下拉菜單中,將第一來激活該菜單。修改完成后,按下回車鍵,并在彈出的下拉菜單中,將第一項改為項改為“新建文件新建文件(&N)”并按下回車鍵。并按下回車鍵。n這時可以看到在下面的這時可以看到在下面的Action編輯器中已經有了編輯器中已經有了
7、“新建文件新建文件”動作。動作。n在這里用鼠標點擊該動作,將其拖入菜單欄下面的工具欄中。在這里用鼠標點擊該動作,將其拖入菜單欄下面的工具欄中。 菜單欄菜單欄nQMenuBarQMenuBar類提供了一個水平的菜單欄,在類提供了一個水平的菜單欄,在QMainWindowQMainWindow中可以直接獲取它的中可以直接獲取它的默認存在的菜單欄,向其中添加默認存在的菜單欄,向其中添加QMenuQMenu類型的菜單對象,然后向彈出菜單中添類型的菜單對象,然后向彈出菜單中添加加QActionQAction類型的動作對象。類型的動作對象。n在在QMenuQMenu中還提供了間隔器,可以在設計器中向添加菜
8、單那樣直接添加間隔器,中還提供了間隔器,可以在設計器中向添加菜單那樣直接添加間隔器,或者在代碼中使用或者在代碼中使用addSeparator()addSeparator()函數來添加,它是一條水平線,可以將菜函數來添加,它是一條水平線,可以將菜單分成幾組,使得布局很整齊。單分成幾組,使得布局很整齊。n在應用程序中很多普通的命令都是通過菜單來實現的,而我們也希望能將這在應用程序中很多普通的命令都是通過菜單來實現的,而我們也希望能將這些菜單命令放到工具欄中,以方便使用。些菜單命令放到工具欄中,以方便使用。QActionQAction就是這樣一種命令動作,就是這樣一種命令動作,它可以同時放在菜單和工
9、具欄中。一個它可以同時放在菜單和工具欄中。一個QActionQAction動作包含了一個圖標,一個動作包含了一個圖標,一個菜單顯示文本,一個快捷鍵,一個狀態欄顯示文本,一個菜單顯示文本,一個快捷鍵,一個狀態欄顯示文本,一個“Whats ThisWhats This?”顯示文本和一個工具提示文本。這些都可以在構建顯示文本和一個工具提示文本。這些都可以在構建QActionQAction類對象時在構造類對象時在構造函數中指定。函數中指定。n另外還可以設置另外還可以設置QActionQAction的的checkablecheckable屬性,如果指定這個動作的屬性,如果指定這個動作的checkable
10、checkable為為truetrue,那么當選中這個菜單時就會在它的前面顯示,那么當選中這個菜單時就會在它的前面顯示“”之類的表示選中之類的表示選中狀態的符號,如果該菜單有圖標,那么就會用線框將圖標圍住,用來表示該狀態的符號,如果該菜單有圖標,那么就會用線框將圖標圍住,用來表示該動作被選中了。動作被選中了。代碼方式添加菜單代碼方式添加菜單/ 添加編輯菜單添加編輯菜單QMenu *editMenu = ui-menuBar-addMenu(tr(編輯編輯(&E);/ 添加打開菜單添加打開菜單 QAction *action_Open = editMenu-addAction( QIco
11、n(“./images/open.png),tr(打開文件打開文件(&O);/ 設置快捷鍵設置快捷鍵action_Open-setShortcut(QKeySequence(Ctrl+O); / 在工具欄中添加動作在工具欄中添加動作ui-mainToolBar-addAction(action_Open); 工具欄工具欄n工具欄工具欄QToolBar類提供了一個包含了一組控件的可以移動的面板。類提供了一個包含了一組控件的可以移動的面板。在上面已經看到可以將在上面已經看到可以將QAction對象添加到工具欄中,它默認只是顯對象添加到工具欄中,它默認只是顯示一個動作的圖標,這個可以在示一個
12、動作的圖標,這個可以在QToolBar的屬性欄中進行更改。的屬性欄中進行更改。n在設計器中可以查看在設計器中可以查看QToolBar的屬性欄,其中的屬性欄,其中toolButtonStyle屬性屬性設置圖標和相應文本的顯示及其相對位置等;設置圖標和相應文本的顯示及其相對位置等;movabel屬性設置狀態屬性設置狀態欄是否可以移動;欄是否可以移動;allowedArea設置允許停靠的位置;設置允許停靠的位置;iconsize屬性屬性設置圖標的大小;設置圖標的大小;floatable屬性設置是否可以懸浮。屬性設置是否可以懸浮。在工具欄中添加部件在工具欄中添加部件QToolButton *toolB
13、tn = new QToolButton(this); / 創建創建QToolButtontoolBtn-setText(tr(顏色顏色);QMenu *colorMenu = new QMenu(this); / 創建一個菜單創建一個菜單colorMenu-addAction(tr(紅色紅色);colorMenu-addAction(tr(綠色綠色);toolBtn-setMenu(colorMenu); / 添加菜單添加菜單toolBtn-setPopupMode(QToolButton:MenuButtonPopup); / 設置彈出模式設置彈出模式ui-mainToolBar-addW
14、idget(toolBtn); / 向工具欄添加向工具欄添加QToolButton按鈕按鈕QSpinBox *spinBox = new QSpinBox(this); / 創建創建QSpinBoxui-mainToolBar-addWidget(spinBox); / 向工具欄添加向工具欄添加QSpinBox部件部件資源系統資源系統 Qt資源系統是一個獨立于平臺的(跟使用的操作系統無關)資源系統是一個獨立于平臺的(跟使用的操作系統無關)用于在可執行文件中存儲二進制文件的機制。用于在可執行文件中存儲二進制文件的機制。n可以讓需要的文件(圖片、文本等)包含到程序編程生成可以讓需要的文件(圖片、文
15、本等)包含到程序編程生成的可執行文件(例如的可執行文件(例如exe文件)中。文件)中。n保證了程序中使用的文件不會丟失、不會因為存放路徑而保證了程序中使用的文件不會丟失、不會因為存放路徑而導致程序運行錯誤。導致程序運行錯誤。在在Qt Creator中添加資源中添加資源n第一步,添加第一步,添加Qt資源文件。往項目中添加新文件,選擇資源文件。往項目中添加新文件,選擇Qt分類中的分類中的Qt資源文件,文件資源文件,文件名稱改為名稱改為“myImage”,其他選項默認即可。,其他選項默認即可。n第二步,添加資源。建立好資源文件后會默認進入資源管理界面,就是新建的第二步,添加資源。建立好資源文件后會默
16、認進入資源管理界面,就是新建的myImage.qrc文件中。現在先到項目文件夾文件中。現在先到項目文件夾myMainWindow中新建一個名為中新建一個名為“images”的文件夾,并在其中放入兩張圖標圖片,比如這里放入了一個的文件夾,并在其中放入兩張圖標圖片,比如這里放入了一個“new.png”和一個和一個“open.png”圖片。(注意:圖片。(注意:Qt的資源系統要求資源文件必須放在與的資源系統要求資源文件必須放在與qrc文件同文件同級或子級目錄下,如果放在其他地方,當添加資源時會提示將文件復制到有效的位級或子級目錄下,如果放在其他地方,當添加資源時會提示將文件復制到有效的位置。)置。)
17、n 然后回到然后回到Qt Creator中,在資源管理界面,按下中,在資源管理界面,按下“添加添加”按鈕,選擇按鈕,選擇“添加前添加前綴綴”,然后將屬性欄中的前綴改為,然后將屬性欄中的前綴改為“/myImage”,再點擊,再點擊“添加添加”按鈕,選擇按鈕,選擇“添加添加文件文件”,在彈出的對話框中進入到前面新建的,在彈出的對話框中進入到前面新建的images文件夾中,選中那兩張圖片,點文件夾中,選中那兩張圖片,點擊打開即可。這時擊打開即可。這時myImage.qrc文件中就出現了添加的圖片的列表。最后按下文件中就出現了添加的圖片的列表。最后按下Ctrl+S快捷鍵,保存對文件的修改(注意:這一點
18、很重要,如果沒有保存,在下面使用圖片快捷鍵,保存對文件的修改(注意:這一點很重要,如果沒有保存,在下面使用圖片時將看不到圖片)。時將看不到圖片)。 n第三步,使用圖片。在設計模式第三步,使用圖片。在設計模式Action編輯器中雙擊編輯器中雙擊“新建文件新建文件”動作,這動作,這時會彈出編輯動作對話框。在其中將對象名稱改為時會彈出編輯動作對話框。在其中將對象名稱改為“action_New”,工具提,工具提示改為示改為“新建文件新建文件”,然后按下圖標后面的按鈕,進入選擇資源界面。,然后按下圖標后面的按鈕,進入選擇資源界面。n第一次進入該界面還沒有顯示可用的資源,需要按下左上角的重新加載綠色第一次
19、進入該界面還沒有顯示可用的資源,需要按下左上角的重新加載綠色箭頭圖標,這時圖片資源就顯示出來了。這里選擇箭頭圖標,這時圖片資源就顯示出來了。這里選擇new.png圖片,然后按下圖片,然后按下確定按鈕。確定按鈕。n如果在編寫代碼時使用如果在編寫代碼時使用new.png圖片,那么就可以將其路徑指定為圖片,那么就可以將其路徑指定為“:/myImage/images/new.png”, 前綴前綴“/myImage”是添加資源時手動設是添加資源時手動設置的。置的。資源文件介紹資源文件介紹n在使用資源時添加的在使用資源時添加的qrcqrc資源文件其實是一個資源文件其實是一個XMLXML格式的文本文件,進入
20、編輯格式的文本文件,進入編輯模式,在模式,在myImage.qrcmyImage.qrc文件上點擊鼠標右鍵,選擇文件上點擊鼠標右鍵,選擇“用用打開打開”“Plain “Plain Text Editor”Text Editor”,這時就會看到,這時就會看到myImage.qrcmyImage.qrc的內容如下:的內容如下: images/new.png images/new.png images/open.png images/open.png 在這里指明了文件類型為在這里指明了文件類型為RCCRCC,表明是,表明是QtQt資源文件。然后是資源前綴,在下面羅資源文件。然后是資源前綴,在下面羅列
21、了添加的圖片的路徑。列了添加的圖片的路徑。 n當往項目中添加了一個資源文件時,會自動往工程文件當往項目中添加了一個資源文件時,會自動往工程文件myMainW中添加代碼:中添加代碼:RESOURCES += RESOURCES += myImage.qrc myImage.qrc這表明項目中使用了資源文件這表明項目中使用了資源文件myImage.qrc。 中心部件中心部件n在主窗口的中心區域可以放置一個中心部件,它一般是一個編輯器或者瀏覽在主窗口的中心區域可以放置一個中心部件,它一般是一個編輯器或者瀏覽器。這里支持單文檔部件,也支持多文檔部件。一般的,會在這里放置一個器。這里支
22、持單文檔部件,也支持多文檔部件。一般的,會在這里放置一個部件,然后使用布局管理器使其充滿整個中心區域,并可以隨著窗口的大小部件,然后使用布局管理器使其充滿整個中心區域,并可以隨著窗口的大小變化而改變大小。例如在設計模式中,往中心區域拖入一個變化而改變大小。例如在設計模式中,往中心區域拖入一個Text Edit,然后,然后點擊界面,按下點擊界面,按下Ctrl+G使其處于一個柵格布局中。使其處于一個柵格布局中。 效果如下。效果如下。Dock部件部件nQDockWidgetQDockWidget類提供了這樣一個部件,它可以停靠在類提供了這樣一個部件,它可以停靠在QMainWindowQMainWin
23、dow中也可以懸中也可以懸浮起來作為桌面頂級窗口,我們稱它為浮起來作為桌面頂級窗口,我們稱它為DockDock部件或者停靠窗口。部件或者停靠窗口。DockDock部件一部件一般用于存放其他一些部件來實現一些特殊功能,就像一個工具箱一樣。它在般用于存放其他一些部件來實現一些特殊功能,就像一個工具箱一樣。它在主窗口中可以停靠在中心部件的四周,也可以懸浮起來,被拖動到任意的地主窗口中可以停靠在中心部件的四周,也可以懸浮起來,被拖動到任意的地方,還可以被關閉或隱藏起來。一個方,還可以被關閉或隱藏起來。一個DockDock部件包含一個標題欄和一個內容區部件包含一個標題欄和一個內容區域,可以向域,可以向D
24、ockDock部件中放入任何部件。部件中放入任何部件。 n例如:例如:在設計模式中向中心區域拖入一個在設計模式中向中心區域拖入一個Dock Widget部件,然后再向部件,然后再向Dock中隨意拖入幾個部件,比如這里拖入一個中隨意拖入幾個部件,比如這里拖入一個Push Button和一個和一個Font Combo Box。然后在。然后在dockWidget的屬性欄中更改其的屬性欄中更改其windowTitle為為“工具箱工具箱”。狀態欄狀態欄nQStatusBar類提供了一個水平條,用來顯示狀態信息。類提供了一個水平條,用來顯示狀態信息。QMainWindow中默中默認提供了一個狀態欄。認提供
25、了一個狀態欄。n狀態信息可以被分為三類:臨時信息,如一般的提示信息;正常信息,如顯狀態信息可以被分為三類:臨時信息,如一般的提示信息;正常信息,如顯示頁數和行號;永久信息,如顯示版本號或者日期。可以使用示頁數和行號;永久信息,如顯示版本號或者日期。可以使用showMessage()函數來顯示一個臨時消息,它會出現在狀態欄的最左邊。一函數來顯示一個臨時消息,它會出現在狀態欄的最左邊。一般用般用addWidget()函數添加一個函數添加一個QLabel到狀態欄上用于顯示正常信息,它會到狀態欄上用于顯示正常信息,它會生成到狀態欄的最左邊,可能會被臨時消息所掩蓋。如果要顯示永久信息,生成到狀態欄的最左
26、邊,可能會被臨時消息所掩蓋。如果要顯示永久信息,要使用要使用addPermanentWidget()函數來添加一個如函數來添加一個如QLabel一樣的可以顯示信一樣的可以顯示信息的部件,它會生成在狀態欄的最右端,不會被臨時消息所掩蓋。息的部件,它會生成在狀態欄的最右端,不會被臨時消息所掩蓋。n在狀態欄的最右端,還有一個在狀態欄的最右端,還有一個QSizeGrip部件,用來調整窗口的大小,可以部件,用來調整窗口的大小,可以使用使用setSizeGripEnabled()函數來禁用它。函數來禁用它。 目前的設計器中還不支持直接向狀態欄中拖放部件,所以需要使用代碼來生目前的設計器中還不支持直接向狀態
27、欄中拖放部件,所以需要使用代碼來生成。例如:成。例如:/ 顯示臨時消息,顯示顯示臨時消息,顯示2000毫秒即毫秒即2秒鐘秒鐘ui-statusBar-showMessage(tr(歡迎使用多文檔編輯器歡迎使用多文檔編輯器), 2000);/ 創建標簽,設置標簽樣式并顯示信息,將其以永久部件的形式添加到狀態欄創建標簽,設置標簽樣式并顯示信息,將其以永久部件的形式添加到狀態欄QLabel *permanent = new QLabel(this); permanent-setFrameStyle(QFrame:Box | QFrame:Sunken); permanent-setText(); u
28、i-statusBar-addPermanentWidget(permanent);此時運行程序,可以發現此時運行程序,可以發現“歡迎使用多文檔編輯器歡迎使用多文檔編輯器”字符串在顯示一會兒后字符串在顯示一會兒后就自動消失了,而就自動消失了,而“”一直顯示在狀態欄最右端。一直顯示在狀態欄最右端。 自定義菜單自定義菜單Qt中的中的QWidgetAction類可以實現自定義菜單的功能。為了實現自類可以實現自定義菜單的功能。為了實現自定義菜單,需要新建一個類,它繼承自定義菜單,需要新建一個類,它繼承自QWidgetAction類,并且在其類,并且在其中重新實現中重新實現createWidget()函
29、數。函數。 自學內容:自學內容:寫一個程序,實現了這樣一個菜單:它包含一個標簽和一寫一個程序,實現了這樣一個菜單:它包含一個標簽和一個行編輯器,可以在行編輯器中輸入字符串,然后按下回車鍵,就可個行編輯器,可以在行編輯器中輸入字符串,然后按下回車鍵,就可以自動將字符串輸入到中心部件文本編輯器中。以自動將字符串輸入到中心部件文本編輯器中。 5.2 富文本處理富文本處理 富文本(富文本(Rich TextRich Text)或者叫做富文本格式,簡單來說就是在)或者叫做富文本格式,簡單來說就是在文檔中可以使用多種格式,比如字體顏色、圖片和表格等等。它文檔中可以使用多種格式,比如字體顏色、圖片和表格等等
30、。它是與純文本(是與純文本(Plain TextPlain Text)相對而言的,比如)相對而言的,比如WindowsWindows上的記事本上的記事本就是純文本編輯器,而就是純文本編輯器,而WordWord就是富文本編輯器。就是富文本編輯器。n富文本文檔結構富文本文檔結構 n文本塊文本塊 n表格、列表與圖片表格、列表與圖片 n查找功能查找功能 n語法高亮與語法高亮與HTML HTML 在在Qt中提供了對富文本處理的支持。中提供了對富文本處理的支持。Qt中對富文本的處理分為了編輯操作和中對富文本的處理分為了編輯操作和只讀操作兩種方式。只讀操作兩種方式。n編輯操作是使用基于光標的一些接口函數,這
31、樣更好的模擬了用戶的編輯操編輯操作是使用基于光標的一些接口函數,這樣更好的模擬了用戶的編輯操作,更加容易理解,而且不會丟失底層的文檔框架;作,更加容易理解,而且不會丟失底層的文檔框架;n而對于文檔結構的概覽,使用了只讀的分層次的接口函數,它們有利于文檔而對于文檔結構的概覽,使用了只讀的分層次的接口函數,它們有利于文檔的檢索和輸出。的檢索和輸出。 對于文檔的讀取和編輯要使用不同方面的兩組接口。對于文檔的讀取和編輯要使用不同方面的兩組接口。n文檔的光標主要基于文檔的光標主要基于QTextCursor類類n文檔的框架主要基于文檔的框架主要基于QTextDocument類。類。 一個富文本文檔的結構被
32、分為了幾種元素來表示,分別是框架一個富文本文檔的結構被分為了幾種元素來表示,分別是框架(QTextFrame)、文本塊()、文本塊(QTextBlock)、表格()、表格(QTextTable)和列表)和列表(QTextList)。)。 每種元素的格式又使用相應的每種元素的格式又使用相應的format類來表示,它們分別是框架格式類來表示,它們分別是框架格式(QTextFrameFormat)、文本塊格式()、文本塊格式(QTextBlockFormat)、表格格式)、表格格式(QTextTableFormat)和列表格式()和列表格式(QTextListFormat),這些格式一般),這些格式
33、一般在編輯文檔時使用,所以它們常和在編輯文檔時使用,所以它們常和QTextCursor類配合使用。類配合使用。 富文本文檔結構富文本文檔結構 因為因為QTextEdit類就是一個富文本編輯器,所以在構建類就是一個富文本編輯器,所以在構建QTextEdit類的對類的對象時就已經構建了一個象時就已經構建了一個QTextDocument類對象和一個類對象和一個QTextCursor類對象,類對象,只需調用它們進行相應的操作即可。只需調用它們進行相應的操作即可。 一個空的文檔包含了一個根框架(一個空的文檔包含了一個根框架(Root frame),這個根框架又包含了),這個根框架又包含了一個空的文本塊(
34、一個空的文本塊(Block)。框架將一個文檔分為多個部分,在根框架里可)。框架將一個文檔分為多個部分,在根框架里可以再添加文本塊、子框架和表格等。以再添加文本塊、子框架和表格等。 設置根框架設置根框架QTextDocument *document = ui-textEdit-document(); /獲取文檔對象獲取文檔對象QTextFrame *rootFrame = document-rootFrame(); / 獲取根框架獲取根框架QTextFrameFormat format; / 創建框架格式創建框架格式format.setBorderBrush(Qt:red); / 邊界顏色邊界顏
35、色format.setBorder(3); / 邊界寬度邊界寬度rootFrame-setFrameFormat(format); / 框架使用格式框架使用格式添加子框架添加子框架QTextFrameFormat frameFormat;frameFormat.setBackground(Qt:lightGray); / 設置背景顏色設置背景顏色frameFormat.setMargin(10); / 設置邊距設置邊距frameFormat.setPadding(5); / 設置填襯設置填襯frameFormat.setBorder(2);/設置邊框樣式設置邊框樣式frameFormat.se
36、tBorderStyle(QTextFrameFormat:BorderStyle_Dotted); QTextCursor cursor = ui-textEdit-textCursor(); / 獲取光標獲取光標cursor.insertFrame(frameFormat); / 在光標處插入框架在光標處插入框架文本塊文本塊文本塊文本塊QTextBlock類為文本文檔類為文本文檔QTextDocument提供了一個文本片提供了一個文本片段(段(QTextFragment)的容器。)的容器。 一個文本塊可以看做是一個段落,但是它不能使用回車換行,因為一一個文本塊可以看做是一個段落,但是它不能
37、使用回車換行,因為一個回車換行就表示創建一個新的文本塊。個回車換行就表示創建一個新的文本塊。QTextBlock提供了只讀接提供了只讀接口,它是前面提到的文檔分層次的接口的一部分,如果口,它是前面提到的文檔分層次的接口的一部分,如果QTextFrame看做是一層,那么其中的看做是一層,那么其中的QTextBlock就是另一層。就是另一層。 文本塊的格式由文本塊的格式由QTextBlockFormat類來處理,它主要涉及對齊方式,類來處理,它主要涉及對齊方式,文本塊四周的邊白,縮進等內容。而文本塊中的文本內容的格式,比文本塊四周的邊白,縮進等內容。而文本塊中的文本內容的格式,比如字體大小、加粗、
38、下劃線等內容,則由如字體大小、加粗、下劃線等內容,則由QTextCharFormat類來設類來設置。置。 遍歷框架遍歷框架 QTextDocument *document = ui-textEdit-document(); QTextFrame *frame = document-rootFrame(); QTextFrame:iterator it; / 建立建立QTextFrame類的迭代器類的迭代器 for (it = frame-begin(); !(it.atEnd(); +it) QTextFrame *childFrame = it.currentFrame();/ 獲取當前框架
39、的指針獲取當前框架的指針 QTextBlock childBlock = it.currentBlock(); / 獲取當前文本塊獲取當前文本塊 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,內容為:內容為:) .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); / 表格內邊白表格內邊白 cursor.insertTable(2, 2, format); / 插入插入2行行2列表格列表格n插入列表插入列表 QTextListFormat format; / 列表格式
43、列表格式 format.setStyle(QTextListFormat:ListDecimal); / 數字編號數字編號 ui-textEdit-textCursor().insertList(format);n插入圖片插入圖片 QTextImageFormat format; / 圖片格式圖片格式 format.setName(logo.png); / 圖片路徑圖片路徑 ui-textEdit-textCursor().insertImage(format);查找功能查找功能n查找文本查找文本 QDialog *dlg = new QDialog(this); / 創建對話框創建對話框 l
44、ineEdit = new QLineEdit(dlg); / 創建行編輯器創建行編輯器 QPushButton *btn = new QPushButton(dlg); / 創建按鈕創建按鈕 btn-setText(tr(查找下一個查找下一個); connect(btn,SIGNAL(clicked(),this,SLOT(findNext(); / 關聯信號和槽關聯信號和槽 QVBoxLayout *layout = new QVBoxLayout; / 創建垂直布局管理器創建垂直布局管理器 layout-addWidget(lineEdit); / 添加部件添加部件 layout-add
45、Widget(btn); dlg-setLayout(layout); / 在對話框中使用布局管理器在對話框中使用布局管理器 dlg-show();n查找下一個查找下一個 QString string = lineEdit-text(); / 使用查找函數查找指定字符串,查找方式為向后查找使用查找函數查找指定字符串,查找方式為向后查找 bool isfind = ui-textEdit-find(string, QTextDocument:FindBackward); if(isfind) / 如果查找成功,輸出字符串所在行和列的編號如果查找成功,輸出字符串所在行和列的編號 qDebug()
46、textEdit-textCursor().blockNumber() .arg(ui-textEdit-textCursor().columnNumber(); 語法高亮語法高亮 在使用在使用Qt Creator編輯代碼時可以發現,輸入關鍵字時會顯示不同的顏色,編輯代碼時可以發現,輸入關鍵字時會顯示不同的顏色,這就是所謂的語法高亮。這就是所謂的語法高亮。 在在Qt的富文本處理中提供了的富文本處理中提供了QSyntaxHighlighter類來實現語法高亮。為了實類來實現語法高亮。為了實現這個功能,需要創建現這個功能,需要創建QSyntaxHighlighter類的子類,然后重新實現類的子類,
47、然后重新實現highlightBlock()函數,使用時直接將函數,使用時直接將QTextDocument類對象指針作為其父類對象指針作為其父部件指針,這樣就可以自動調用部件指針,這樣就可以自動調用highlightBlock()函數了。函數了。 例如,自定義的類為例如,自定義的類為MySyntaxHighlighter,像這樣來使用:,像這樣來使用: highlighter = new MySyntaxHighlighter(ui-textEdit-document(); 這里創建了這里創建了MySyntaxHighlighter類的對象,并且使用編輯器的文檔對象指針作為其類的對象,并且使用
48、編輯器的文檔對象指針作為其參數,這樣,每當編輯器中的文本改變時都會調用參數,這樣,每當編輯器中的文本改變時都會調用highlightBlock()函數來設置語法函數來設置語法高亮。高亮。 重新實現重新實現highlightBlock()函數:函數: QTextCharFormat myFormat; / 字符格式字符格式 myFormat.setFontWeight(QFont:Bold); myFormat.setForeground(Qt:green); QString pattern = bcharb; / 要匹配的字符,這里是要匹配的字符,這里是“char”單詞單詞 QRegExp e
49、xpression(pattern); / 創建正則表達式創建正則表達式 int index = text.indexOf(expression); / 從位置從位置0開始匹配字符串開始匹配字符串 / 如果匹配成功,那么返回值為字符串的起始位置,它大于或等于如果匹配成功,那么返回值為字符串的起始位置,它大于或等于0 while (index = 0) int length = expression.matchedLength(); / 要匹配字符串的長度要匹配字符串的長度 setFormat(index, length, myFormat); / 對要匹配的字符串設置格式對要匹配的字符串設置格
50、式 index = text.indexOf(expression, index + length); / 繼續匹配繼續匹配 在這里主要是使用了正則表達式和在這里主要是使用了正則表達式和QString類的類的indexOf()函數來函數來進行字符串的匹配,如果匹配成功,則使用進行字符串的匹配,如果匹配成功,則使用QSyntaxHighlighter類的類的setFormat()函數來設置字符格式。函數來設置字符格式。 HTML 在富文本處理中還提供了對在富文本處理中還提供了對HTML子集的支持,可以在子集的支持,可以在QLabel或者或者QTextEdit添加文本時使用添加文本時使用HTML標
51、簽或者標簽或者CSS屬性,例如:屬性,例如: ui-textEdit-append(tr(使用使用HTML); 這里往編輯器中添加了文本,并且使用了這里往編輯器中添加了文本,并且使用了HTML標簽,標簽, 5.3 拖放操作拖放操作 對于一個實用的應用程序,我們不僅希望能從文件菜單中打開一個對于一個實用的應用程序,我們不僅希望能從文件菜單中打開一個文件,更希望可以通過拖動,直接將桌面上的文件拖入程序界面上文件,更希望可以通過拖動,直接將桌面上的文件拖入程序界面上來打開,就像可以將來打開,就像可以將.文件拖入文件拖入Qt CreatorQt Creator中來打開整個項目一中來打開整
52、個項目一樣。樣。QtQt中提供了強大的拖放機制,拖放操作分為拖動(中提供了強大的拖放機制,拖放操作分為拖動(DragDrag)和放)和放下(下(DropDrop)兩種操作。當數據被拖動時會被存儲為)兩種操作。當數據被拖動時會被存儲為MIME MIME (Multipurpose Internet Mail Extensions)(Multipurpose Internet Mail Extensions)類型,在類型,在QtQt中使用中使用QMimeDataQMimeData類來表示類來表示MIMEMIME類型的數據,并使用類型的數據,并使用QDragQDrag類來完成數據的類來完成數據的轉移
53、,而整個拖放操作都是在幾個鼠標事件和拖放事件中完成的。轉移,而整個拖放操作都是在幾個鼠標事件和拖放事件中完成的。n使用拖放打開文件使用拖放打開文件 n自定義拖放操作自定義拖放操作 使用拖放打開文件使用拖放打開文件例如:將桌面上的例如:將桌面上的txt文本文件拖入自己編寫的程序中來打開。使用拖放文本文件拖入自己編寫的程序中來打開。使用拖放需要聲明兩個函數:需要聲明兩個函數:protected: void dragEnterEvent(QDragEnterEvent *event); / 拖動進入事件拖動進入事件 void dropEvent(QDropEvent *event); / 放下事件放
54、下事件拖入操作拖入操作void MainWindow:dragEnterEvent(QDragEnterEvent *event) / 進入事件進入事件 if(event-mimeData()-hasUrls() / 數據中是否包含數據中是否包含URL event-acceptProposedAction(); / 如果是則接收動作如果是則接收動作 else event-ignore(); / 否則忽略該事件否則忽略該事件 當鼠標拖拽一個數據進入主窗口時,就會觸發當鼠標拖拽一個數據進入主窗口時,就會觸發dragEventEvent()事件處理函事件處理函數,獲取其中的數,獲取其中的MIME數據
55、,然后查看它是否包含數據,然后查看它是否包含URL路徑,因為拖入的文路徑,因為拖入的文本文件實際上就是拖入了它的路徑,這就是本文件實際上就是拖入了它的路徑,這就是event-mimeData()-hasUrls()實現的功能。如果有這樣的數據,就接收它,否則就忽略該事件。實現的功能。如果有這樣的數據,就接收它,否則就忽略該事件。 放下操作放下操作void MainWindow:dropEvent(QDropEvent *event) / 放下事件放下事件 const QMimeData *mimeData = event-mimeData(); / 獲取獲取MIME數據數據 if(mimeDa
56、ta-hasUrls() / 如果數據中包含如果數據中包含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(); / 將文件中所有內容讀入編輯器將文件中所有內容讀入編輯器 當松開鼠標左鍵,將數據放入主窗口時就會觸發當松開鼠標左鍵,將數據放入主窗口時就會觸發dropEvent()事件處理函數,這事件處理函數,這里獲取了里獲取了MIME數據中的數據中的URL列表,因為拖入的只有一個文件,所以獲取了列表列表,因為拖入的只有一個文件,所以獲取了列表中的第一個條目,并使用中的第一個條目,并使用toLocalFile()函數將它轉換為本地文
58、件路徑。然后使用函數將它轉換為本地文件路徑。然后使用QFile和和QTextStream將文件中的數據讀入編輯器中。將文件中的數據讀入編輯器中。MIME類型數據處理函數類型數據處理函數 在在QMimeData類中提供了幾個函數來方便的處理常見的類中提供了幾個函數來方便的處理常見的MIME數據數據 :自定義拖放操作自定義拖放操作 下面以在窗口中拖動圖片為例,需要聲明以下幾個函數:下面以在窗口中拖動圖片為例,需要聲明以下幾個函數:protected: void mousePressEvent(QMouseEvent *event); / 鼠標按下事件鼠標按下事件 void dragEnterEve
59、nt(QDragEnterEvent *event); / 拖動進入事件拖動進入事件 void dragMoveEvent(QDragMoveEvent *event); / 拖動事件拖動事件 void dropEvent(QDropEvent *event); / 放下事件放下事件nmousePressEvent: 為拖動圖片做準備工作,將圖片數據放到自定義的為拖動圖片做準備工作,將圖片數據放到自定義的MIME類型中。類型中。ndragEnterEvent: 開始拖動,先判斷是否包含需要移動的類型。開始拖動,先判斷是否包含需要移動的類型。ndragMoveEvent:拖動過程。:拖動過程。n
60、dropEvent:放下圖片,創建新的圖片放到光標處。:放下圖片,創建新的圖片放到光標處。 當鼠標按下時當鼠標按下時會觸發鼠標按下事件,進而執行其處理函數,在這里進行了一系列操作,大體上可以會觸發鼠標按下事件,進而執行其處理函數,在這里進行了一系列操作,大體上可以分為六步。分為六步。n第一步,先獲取鼠標指針所在處的部件的指針,將它強制轉換為第一步,先獲取鼠標指針所在處的部件的指針,將它強制轉換為QLabel類型的指針,然后使用類型的指針,然后使用inherits()函數判斷它是否是函數判斷它是否是QLabel類型,如果不是則直接返回,不再進行下面的操作。類型,如果不是則直接返回,不再進行下面的操作。n第二步,因為不僅要在拖動的數據中包含圖片數據
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國FM自動選臺收音機望遠鏡數據監測研究報告
- 2025年中國BOPP鍍鋁膜數據監測研究報告
- 2025年中國2、5-二甲基苯胺數據監測報告
- 2025至2030年中國集中操作式電梯井筒模市場分析及競爭策略研究報告
- 2025至2030年中國鋁合金吸頂燈市場分析及競爭策略研究報告
- 2025至2030年中國茴香粉市場分析及競爭策略研究報告
- 2025至2030年中國砼攪拌站市場分析及競爭策略研究報告
- 2025至2030年中國電力控制開關柜市場分析及競爭策略研究報告
- 2025至2030年中國深溝外球面球軸承市場分析及競爭策略研究報告
- 2025至2030年中國汽車儲液器支架市場分析及競爭策略研究報告
- CLSI EP25-A 穩定性考察研究
- SJG 44-2018 深圳市公共建筑節能設計規范-高清現行
- 職工子女暑期工會愛心托管班的方案通知
- (5年高職)客戶服務實務(第二版)教學課件全套電子教案匯總整本書課件最全教學教程完整版教案(最新)
- 精品中文版b4a新手指南第4章開發環境
- 兒科患兒及家屬的溝通技巧
- 光纜線路的故障分析及障礙搶修
- 童聲合唱訓練講座
- (防火閥)檢驗報告
- 輸變電工程建設管理程序指南(共61頁)
- 《屏蔽泵培訓講義》
評論
0/150
提交評論