Qt Creator快速入門(mén) 第5章 應(yīng)用程序主窗口_第1頁(yè)
Qt Creator快速入門(mén) 第5章 應(yīng)用程序主窗口_第2頁(yè)
Qt Creator快速入門(mén) 第5章 應(yīng)用程序主窗口_第3頁(yè)
Qt Creator快速入門(mén) 第5章 應(yīng)用程序主窗口_第4頁(yè)
Qt Creator快速入門(mén) 第5章 應(yīng)用程序主窗口_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Qt Creator快速入門(mén)快速入門(mén)第第2版版第第5 5章章 應(yīng)用程序主窗口應(yīng)用程序主窗口(3課時(shí)) 這一章開(kāi)始接觸應(yīng)用程序主窗口的相關(guān)內(nèi)容。對(duì)于日常見(jiàn)到的應(yīng)用程這一章開(kāi)始接觸應(yīng)用程序主窗口的相關(guān)內(nèi)容。對(duì)于日常見(jiàn)到的應(yīng)用程序而言,它們中的許多都是基于主窗口的,主窗口中包含了菜單欄、序而言,它們中的許多都是基于主窗口的,主窗口中包含了菜單欄、工具欄、狀態(tài)欄和中心區(qū)域等。本章會(huì)詳細(xì)介紹主窗口的每一個(gè)部分,工具欄、狀態(tài)欄和中心區(qū)域等。本章會(huì)詳細(xì)介紹主窗口的每一個(gè)部分,還會(huì)涉及到資源管理、富文本處理、拖放操作和文檔打印等相關(guān)內(nèi)容。還會(huì)涉及到資源管理、富文本處理、拖放操作和文檔打印等相關(guān)內(nèi)容。 在在Qt

2、Qt中提供了以中提供了以QMainWindowQMainWindow類(lèi)為核心的主窗口框架,它包含了類(lèi)為核心的主窗口框架,它包含了眾多相關(guān)的類(lèi):眾多相關(guān)的類(lèi):主主 要要 內(nèi)內(nèi) 容容n5.1 主窗口框架(第主窗口框架(第1課時(shí))課時(shí))n5.2 富文本處理(第富文本處理(第2課時(shí))課時(shí))n5.3 拖放操作(第拖放操作(第3課時(shí))課時(shí))n5.4 打印文檔(第打印文檔(第3課時(shí))課時(shí))n5.5 小結(jié)(第小結(jié)(第3課時(shí))課時(shí))5.1 主窗口框架主窗口框架n菜單欄和工具欄菜單欄和工具欄n使用資源系統(tǒng)使用資源系統(tǒng)n中心部件中心部件nDock部件部件n狀態(tài)欄狀態(tài)欄n自定義菜單自定義菜單 主窗口為建立應(yīng)用程序用戶

3、界面提供了一個(gè)框架,主窗口為建立應(yīng)用程序用戶界面提供了一個(gè)框架,QtQt提供了提供了QMainWindowQMainWindow和和與其相關(guān)的一些類(lèi)來(lái)進(jìn)行主窗口的管理。與其相關(guān)的一些類(lèi)來(lái)進(jìn)行主窗口的管理。QMainWindowQMainWindow類(lèi)擁有自己的布局:類(lèi)擁有自己的布局:菜單欄(菜單欄(QMenuBar)。菜)。菜單欄包含了一個(gè)下拉菜單項(xiàng)的單欄包含了一個(gè)下拉菜單項(xiàng)的列表,這些菜單項(xiàng)由列表,這些菜單項(xiàng)由QAction動(dòng)作類(lèi)實(shí)現(xiàn)。菜單欄位于主窗動(dòng)作類(lèi)實(shí)現(xiàn)。菜單欄位于主窗口的頂部,一個(gè)主窗口只能有口的頂部,一個(gè)主窗口只能有一個(gè)菜單欄。一個(gè)菜單欄。工具欄(工具欄(QToolBar)。工)。

4、工具欄一般用于顯示一些常用具欄一般用于顯示一些常用的菜單項(xiàng)目,它也可以插入的菜單項(xiàng)目,它也可以插入其他窗口部件,并且工具欄其他窗口部件,并且工具欄是可以移動(dòng)的。一個(gè)主窗口是可以移動(dòng)的。一個(gè)主窗口可以擁有多個(gè)工具欄。可以擁有多個(gè)工具欄。中心部件(中心部件(Central Widget)。在主窗口的中心)。在主窗口的中心區(qū)域可以放入一個(gè)窗口部件區(qū)域可以放入一個(gè)窗口部件作為中心部件,它是應(yīng)用程作為中心部件,它是應(yīng)用程序的主要功能實(shí)現(xiàn)區(qū)域。一序的主要功能實(shí)現(xiàn)區(qū)域。一個(gè)主窗口只能擁有一個(gè)中心個(gè)主窗口只能擁有一個(gè)中心部件。部件。Dock部件部件(QDockWidget)。)。Dock部部件常被稱為停靠窗口

5、,因?yàn)樗1环Q為停靠窗口,因?yàn)樗梢酝?吭谥行牟考乃闹堋?梢酝?吭谥行牟考乃闹堋K脕?lái)放置一些部件來(lái)實(shí)現(xiàn)一它用來(lái)放置一些部件來(lái)實(shí)現(xiàn)一些功能,就像個(gè)工具箱一樣。些功能,就像個(gè)工具箱一樣。一個(gè)主窗口可以擁有多個(gè)一個(gè)主窗口可以擁有多個(gè)Dock部件。部件。狀態(tài)欄(狀態(tài)欄(QStatusBar)。)。狀態(tài)欄用于顯示程序的一些狀態(tài)欄用于顯示程序的一些狀態(tài)信息,它在主窗口的最狀態(tài)信息,它在主窗口的最底部。一個(gè)主窗口只能擁有底部。一個(gè)主窗口只能擁有一個(gè)狀態(tài)欄。一個(gè)狀態(tài)欄。在設(shè)計(jì)器中給菜單欄、工具欄添加動(dòng)作在設(shè)計(jì)器中給菜單欄、工具欄添加動(dòng)作 在在Qt Creator中雙擊項(xiàng)目中的中雙擊項(xiàng)目中的.ui文件進(jìn)

6、入設(shè)計(jì)模式。文件進(jìn)入設(shè)計(jì)模式。n添加菜單,雙擊左上角的添加菜單,雙擊左上角的“在這里輸入在這里輸入”,修改為,修改為“文件文件(&F)”,這里要使用,這里要使用英文半角的括號(hào),英文半角的括號(hào),“&F”被稱為加速鍵,表明程序運(yùn)行時(shí),可以按下被稱為加速鍵,表明程序運(yùn)行時(shí),可以按下Alt+F鍵鍵來(lái)激活該菜單。修改完成后,按下回車(chē)鍵,并在彈出的下拉菜單中,將第一來(lái)激活該菜單。修改完成后,按下回車(chē)鍵,并在彈出的下拉菜單中,將第一項(xiàng)改為項(xiàng)改為“新建文件新建文件(&N)”并按下回車(chē)鍵。并按下回車(chē)鍵。n這時(shí)可以看到在下面的這時(shí)可以看到在下面的Action編輯器中已經(jīng)有了編輯器中已經(jīng)有了

7、“新建文件新建文件”動(dòng)作。動(dòng)作。n在這里用鼠標(biāo)點(diǎn)擊該動(dòng)作,將其拖入菜單欄下面的工具欄中。在這里用鼠標(biāo)點(diǎn)擊該動(dòng)作,將其拖入菜單欄下面的工具欄中。 菜單欄菜單欄nQMenuBarQMenuBar類(lèi)提供了一個(gè)水平的菜單欄,在類(lèi)提供了一個(gè)水平的菜單欄,在QMainWindowQMainWindow中可以直接獲取它的中可以直接獲取它的默認(rèn)存在的菜單欄,向其中添加默認(rèn)存在的菜單欄,向其中添加QMenuQMenu類(lèi)型的菜單對(duì)象,然后向彈出菜單中添類(lèi)型的菜單對(duì)象,然后向彈出菜單中添加加QActionQAction類(lèi)型的動(dòng)作對(duì)象。類(lèi)型的動(dòng)作對(duì)象。n在在QMenuQMenu中還提供了間隔器,可以在設(shè)計(jì)器中向添加菜

8、單那樣直接添加間隔器,中還提供了間隔器,可以在設(shè)計(jì)器中向添加菜單那樣直接添加間隔器,或者在代碼中使用或者在代碼中使用addSeparator()addSeparator()函數(shù)來(lái)添加,它是一條水平線,可以將菜函數(shù)來(lái)添加,它是一條水平線,可以將菜單分成幾組,使得布局很整齊。單分成幾組,使得布局很整齊。n在應(yīng)用程序中很多普通的命令都是通過(guò)菜單來(lái)實(shí)現(xiàn)的,而我們也希望能將這在應(yīng)用程序中很多普通的命令都是通過(guò)菜單來(lái)實(shí)現(xiàn)的,而我們也希望能將這些菜單命令放到工具欄中,以方便使用。些菜單命令放到工具欄中,以方便使用。QActionQAction就是這樣一種命令動(dòng)作,就是這樣一種命令動(dòng)作,它可以同時(shí)放在菜單和工

9、具欄中。一個(gè)它可以同時(shí)放在菜單和工具欄中。一個(gè)QActionQAction動(dòng)作包含了一個(gè)圖標(biāo),一個(gè)動(dòng)作包含了一個(gè)圖標(biāo),一個(gè)菜單顯示文本,一個(gè)快捷鍵,一個(gè)狀態(tài)欄顯示文本,一個(gè)菜單顯示文本,一個(gè)快捷鍵,一個(gè)狀態(tài)欄顯示文本,一個(gè)“Whats ThisWhats This?”顯示文本和一個(gè)工具提示文本。這些都可以在構(gòu)建顯示文本和一個(gè)工具提示文本。這些都可以在構(gòu)建QActionQAction類(lèi)對(duì)象時(shí)在構(gòu)造類(lèi)對(duì)象時(shí)在構(gòu)造函數(shù)中指定。函數(shù)中指定。n另外還可以設(shè)置另外還可以設(shè)置QActionQAction的的checkablecheckable屬性,如果指定這個(gè)動(dòng)作的屬性,如果指定這個(gè)動(dòng)作的checkable

10、checkable為為truetrue,那么當(dāng)選中這個(gè)菜單時(shí)就會(huì)在它的前面顯示,那么當(dāng)選中這個(gè)菜單時(shí)就會(huì)在它的前面顯示“”之類(lèi)的表示選中之類(lèi)的表示選中狀態(tài)的符號(hào),如果該菜單有圖標(biāo),那么就會(huì)用線框?qū)D標(biāo)圍住,用來(lái)表示該狀態(tài)的符號(hào),如果該菜單有圖標(biāo),那么就會(huì)用線框?qū)D標(biāo)圍住,用來(lái)表示該動(dòng)作被選中了。動(dòng)作被選中了。代碼方式添加菜單代碼方式添加菜單/ 添加編輯菜單添加編輯菜單QMenu *editMenu = ui-menuBar-addMenu(tr(編輯編輯(&E);/ 添加打開(kāi)菜單添加打開(kāi)菜單 QAction *action_Open = editMenu-addAction( QIco

11、n(“./images/open.png),tr(打開(kāi)文件打開(kāi)文件(&O);/ 設(shè)置快捷鍵設(shè)置快捷鍵action_Open-setShortcut(QKeySequence(Ctrl+O); / 在工具欄中添加動(dòng)作在工具欄中添加動(dòng)作ui-mainToolBar-addAction(action_Open); 工具欄工具欄n工具欄工具欄QToolBar類(lèi)提供了一個(gè)包含了一組控件的可以移動(dòng)的面板。類(lèi)提供了一個(gè)包含了一組控件的可以移動(dòng)的面板。在上面已經(jīng)看到可以將在上面已經(jīng)看到可以將QAction對(duì)象添加到工具欄中,它默認(rèn)只是顯對(duì)象添加到工具欄中,它默認(rèn)只是顯示一個(gè)動(dòng)作的圖標(biāo),這個(gè)可以在示一個(gè)

12、動(dòng)作的圖標(biāo),這個(gè)可以在QToolBar的屬性欄中進(jìn)行更改。的屬性欄中進(jìn)行更改。n在設(shè)計(jì)器中可以查看在設(shè)計(jì)器中可以查看QToolBar的屬性欄,其中的屬性欄,其中toolButtonStyle屬性屬性設(shè)置圖標(biāo)和相應(yīng)文本的顯示及其相對(duì)位置等;設(shè)置圖標(biāo)和相應(yīng)文本的顯示及其相對(duì)位置等;movabel屬性設(shè)置狀態(tài)屬性設(shè)置狀態(tài)欄是否可以移動(dòng);欄是否可以移動(dòng);allowedArea設(shè)置允許停靠的位置;設(shè)置允許??康奈恢茫籭consize屬性屬性設(shè)置圖標(biāo)的大?。辉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)建一個(gè)菜單創(chuàng)建一個(gè)菜單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)是一個(gè)獨(dú)立于平臺(tái)的(跟使用的操作系統(tǒng)無(wú)關(guān))資源系統(tǒng)是一個(gè)獨(dú)立于平臺(tái)的(跟使用的操作系統(tǒng)無(wú)關(guān))用于在可執(zhí)行文件中存儲(chǔ)二進(jìn)制文件的機(jī)制。用于在可執(zhí)行文件中存儲(chǔ)二進(jìn)制文件的機(jī)制。n可以讓需要的文件(圖片、文本等)包含到程序編程生成可以讓需要的文件(圖片、文

15、本等)包含到程序編程生成的可執(zhí)行文件(例如的可執(zhí)行文件(例如exe文件)中。文件)中。n保證了程序中使用的文件不會(huì)丟失、不會(huì)因?yàn)榇娣怕窂蕉WC了程序中使用的文件不會(huì)丟失、不會(huì)因?yàn)榇娣怕窂蕉鴮?dǎo)致程序運(yùn)行錯(cuò)誤。導(dǎo)致程序運(yùn)行錯(cuò)誤。在在Qt Creator中添加資源中添加資源n第一步,添加第一步,添加Qt資源文件。往項(xiàng)目中添加新文件,選擇資源文件。往項(xiàng)目中添加新文件,選擇Qt分類(lèi)中的分類(lèi)中的Qt資源文件,文件資源文件,文件名稱改為名稱改為“myImage”,其他選項(xiàng)默認(rèn)即可。,其他選項(xiàng)默認(rèn)即可。n第二步,添加資源。建立好資源文件后會(huì)默認(rèn)進(jìn)入資源管理界面,就是新建的第二步,添加資源。建立好資源文件后會(huì)默

16、認(rèn)進(jìn)入資源管理界面,就是新建的myImage.qrc文件中?,F(xiàn)在先到項(xiàng)目文件夾文件中。現(xiàn)在先到項(xiàng)目文件夾myMainWindow中新建一個(gè)名為中新建一個(gè)名為“images”的文件夾,并在其中放入兩張圖標(biāo)圖片,比如這里放入了一個(gè)的文件夾,并在其中放入兩張圖標(biāo)圖片,比如這里放入了一個(gè)“new.png”和一個(gè)和一個(gè)“open.png”圖片。(注意:圖片。(注意:Qt的資源系統(tǒng)要求資源文件必須放在與的資源系統(tǒng)要求資源文件必須放在與qrc文件同文件同級(jí)或子級(jí)目錄下,如果放在其他地方,當(dāng)添加資源時(shí)會(huì)提示將文件復(fù)制到有效的位級(jí)或子級(jí)目錄下,如果放在其他地方,當(dāng)添加資源時(shí)會(huì)提示將文件復(fù)制到有效的位置。)置。)

17、n 然后回到然后回到Qt Creator中,在資源管理界面,按下中,在資源管理界面,按下“添加添加”按鈕,選擇按鈕,選擇“添加前添加前綴綴”,然后將屬性欄中的前綴改為,然后將屬性欄中的前綴改為“/myImage”,再點(diǎn)擊,再點(diǎn)擊“添加添加”按鈕,選擇按鈕,選擇“添加添加文件文件”,在彈出的對(duì)話框中進(jìn)入到前面新建的,在彈出的對(duì)話框中進(jìn)入到前面新建的images文件夾中,選中那兩張圖片,點(diǎn)文件夾中,選中那兩張圖片,點(diǎn)擊打開(kāi)即可。這時(shí)擊打開(kāi)即可。這時(shí)myImage.qrc文件中就出現(xiàn)了添加的圖片的列表。最后按下文件中就出現(xiàn)了添加的圖片的列表。最后按下Ctrl+S快捷鍵,保存對(duì)文件的修改(注意:這一點(diǎn)

18、很重要,如果沒(méi)有保存,在下面使用圖片快捷鍵,保存對(duì)文件的修改(注意:這一點(diǎn)很重要,如果沒(méi)有保存,在下面使用圖片時(shí)將看不到圖片)。時(shí)將看不到圖片)。 n第三步,使用圖片。在設(shè)計(jì)模式第三步,使用圖片。在設(shè)計(jì)模式Action編輯器中雙擊編輯器中雙擊“新建文件新建文件”動(dòng)作,這動(dòng)作,這時(shí)會(huì)彈出編輯動(dòng)作對(duì)話框。在其中將對(duì)象名稱改為時(shí)會(huì)彈出編輯動(dòng)作對(duì)話框。在其中將對(duì)象名稱改為“action_New”,工具提,工具提示改為示改為“新建文件新建文件”,然后按下圖標(biāo)后面的按鈕,進(jìn)入選擇資源界面。,然后按下圖標(biāo)后面的按鈕,進(jìn)入選擇資源界面。n第一次進(jìn)入該界面還沒(méi)有顯示可用的資源,需要按下左上角的重新加載綠色第一次

19、進(jìn)入該界面還沒(méi)有顯示可用的資源,需要按下左上角的重新加載綠色箭頭圖標(biāo),這時(shí)圖片資源就顯示出來(lái)了。這里選擇箭頭圖標(biāo),這時(shí)圖片資源就顯示出來(lái)了。這里選擇new.png圖片,然后按下圖片,然后按下確定按鈕。確定按鈕。n如果在編寫(xiě)代碼時(shí)使用如果在編寫(xiě)代碼時(shí)使用new.png圖片,那么就可以將其路徑指定為圖片,那么就可以將其路徑指定為“:/myImage/images/new.png”, 前綴前綴“/myImage”是添加資源時(shí)手動(dòng)設(shè)是添加資源時(shí)手動(dòng)設(shè)置的。置的。資源文件介紹資源文件介紹n在使用資源時(shí)添加的在使用資源時(shí)添加的qrcqrc資源文件其實(shí)是一個(gè)資源文件其實(shí)是一個(gè)XMLXML格式的文本文件,進(jìn)入

20、編輯格式的文本文件,進(jìn)入編輯模式,在模式,在myImage.qrcmyImage.qrc文件上點(diǎn)擊鼠標(biāo)右鍵,選擇文件上點(diǎn)擊鼠標(biāo)右鍵,選擇“用用打開(kāi)打開(kāi)”“Plain “Plain Text Editor”Text Editor”,這時(shí)就會(huì)看到,這時(shí)就會(huì)看到myImage.qrcmyImage.qrc的內(nèi)容如下:的內(nèi)容如下: images/new.png images/new.png images/open.png images/open.png 在這里指明了文件類(lèi)型為在這里指明了文件類(lèi)型為RCCRCC,表明是,表明是QtQt資源文件。然后是資源前綴,在下面羅資源文件。然后是資源前綴,在下面羅列

21、了添加的圖片的路徑。列了添加的圖片的路徑。 n當(dāng)往項(xiàng)目中添加了一個(gè)資源文件時(shí),會(huì)自動(dòng)往工程文件當(dāng)往項(xiàng)目中添加了一個(gè)資源文件時(shí),會(huì)自動(dòng)往工程文件myMainW中添加代碼:中添加代碼:RESOURCES += RESOURCES += myImage.qrc myImage.qrc這表明項(xiàng)目中使用了資源文件這表明項(xiàng)目中使用了資源文件myImage.qrc。 中心部件中心部件n在主窗口的中心區(qū)域可以放置一個(gè)中心部件,它一般是一個(gè)編輯器或者瀏覽在主窗口的中心區(qū)域可以放置一個(gè)中心部件,它一般是一個(gè)編輯器或者瀏覽器。這里支持單文檔部件,也支持多文檔部件。一般的,會(huì)在這里放置一個(gè)器。這里支

22、持單文檔部件,也支持多文檔部件。一般的,會(huì)在這里放置一個(gè)部件,然后使用布局管理器使其充滿整個(gè)中心區(qū)域,并可以隨著窗口的大小部件,然后使用布局管理器使其充滿整個(gè)中心區(qū)域,并可以隨著窗口的大小變化而改變大小。例如在設(shè)計(jì)模式中,往中心區(qū)域拖入一個(gè)變化而改變大小。例如在設(shè)計(jì)模式中,往中心區(qū)域拖入一個(gè)Text Edit,然后,然后點(diǎn)擊界面,按下點(diǎn)擊界面,按下Ctrl+G使其處于一個(gè)柵格布局中。使其處于一個(gè)柵格布局中。 效果如下。效果如下。Dock部件部件nQDockWidgetQDockWidget類(lèi)提供了這樣一個(gè)部件,它可以停靠在類(lèi)提供了這樣一個(gè)部件,它可以??吭赒MainWindowQMainWin

23、dow中也可以懸中也可以懸浮起來(lái)作為桌面頂級(jí)窗口,我們稱它為浮起來(lái)作為桌面頂級(jí)窗口,我們稱它為DockDock部件或者??看翱?。部件或者??看翱凇ockDock部件一部件一般用于存放其他一些部件來(lái)實(shí)現(xiàn)一些特殊功能,就像一個(gè)工具箱一樣。它在般用于存放其他一些部件來(lái)實(shí)現(xiàn)一些特殊功能,就像一個(gè)工具箱一樣。它在主窗口中可以??吭谥行牟考乃闹埽部梢詰腋∑饋?lái),被拖動(dòng)到任意的地主窗口中可以??吭谥行牟考乃闹埽部梢詰腋∑饋?lái),被拖動(dòng)到任意的地方,還可以被關(guān)閉或隱藏起來(lái)。一個(gè)方,還可以被關(guān)閉或隱藏起來(lái)。一個(gè)DockDock部件包含一個(gè)標(biāo)題欄和一個(gè)內(nèi)容區(qū)部件包含一個(gè)標(biāo)題欄和一個(gè)內(nèi)容區(qū)域,可以向域,可以向D

24、ockDock部件中放入任何部件。部件中放入任何部件。 n例如:例如:在設(shè)計(jì)模式中向中心區(qū)域拖入一個(gè)在設(shè)計(jì)模式中向中心區(qū)域拖入一個(gè)Dock Widget部件,然后再向部件,然后再向Dock中隨意拖入幾個(gè)部件,比如這里拖入一個(gè)中隨意拖入幾個(gè)部件,比如這里拖入一個(gè)Push Button和一個(gè)和一個(gè)Font Combo Box。然后在。然后在dockWidget的屬性欄中更改其的屬性欄中更改其windowTitle為為“工具箱工具箱”。狀態(tài)欄狀態(tài)欄nQStatusBar類(lèi)提供了一個(gè)水平條,用來(lái)顯示狀態(tài)信息。類(lèi)提供了一個(gè)水平條,用來(lái)顯示狀態(tài)信息。QMainWindow中默中默認(rèn)提供了一個(gè)狀態(tài)欄。認(rèn)提供

25、了一個(gè)狀態(tài)欄。n狀態(tài)信息可以被分為三類(lèi):臨時(shí)信息,如一般的提示信息;正常信息,如顯狀態(tài)信息可以被分為三類(lèi):臨時(shí)信息,如一般的提示信息;正常信息,如顯示頁(yè)數(shù)和行號(hào);永久信息,如顯示版本號(hào)或者日期??梢允褂檬卷?yè)數(shù)和行號(hào);永久信息,如顯示版本號(hào)或者日期。可以使用showMessage()函數(shù)來(lái)顯示一個(gè)臨時(shí)消息,它會(huì)出現(xiàn)在狀態(tài)欄的最左邊。一函數(shù)來(lái)顯示一個(gè)臨時(shí)消息,它會(huì)出現(xiàn)在狀態(tài)欄的最左邊。一般用般用addWidget()函數(shù)添加一個(gè)函數(shù)添加一個(gè)QLabel到狀態(tài)欄上用于顯示正常信息,它會(huì)到狀態(tài)欄上用于顯示正常信息,它會(huì)生成到狀態(tài)欄的最左邊,可能會(huì)被臨時(shí)消息所掩蓋。如果要顯示永久信息,生成到狀態(tài)欄的最左

26、邊,可能會(huì)被臨時(shí)消息所掩蓋。如果要顯示永久信息,要使用要使用addPermanentWidget()函數(shù)來(lái)添加一個(gè)如函數(shù)來(lái)添加一個(gè)如QLabel一樣的可以顯示信一樣的可以顯示信息的部件,它會(huì)生成在狀態(tài)欄的最右端,不會(huì)被臨時(shí)消息所掩蓋。息的部件,它會(huì)生成在狀態(tài)欄的最右端,不會(huì)被臨時(shí)消息所掩蓋。n在狀態(tài)欄的最右端,還有一個(gè)在狀態(tài)欄的最右端,還有一個(gè)QSizeGrip部件,用來(lái)調(diào)整窗口的大小,可以部件,用來(lái)調(diào)整窗口的大小,可以使用使用setSizeGripEnabled()函數(shù)來(lái)禁用它。函數(shù)來(lái)禁用它。 目前的設(shè)計(jì)器中還不支持直接向狀態(tài)欄中拖放部件,所以需要使用代碼來(lái)生目前的設(shè)計(jì)器中還不支持直接向狀態(tài)

27、欄中拖放部件,所以需要使用代碼來(lái)生成。例如:成。例如:/ 顯示臨時(shí)消息,顯示顯示臨時(shí)消息,顯示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);此時(shí)運(yùn)行程序,可以發(fā)現(xiàn)此時(shí)運(yùn)行程序,可以發(fā)現(xiàn)“歡迎使用多文檔編輯器歡迎使用多文檔編輯器”字符串在顯示一會(huì)兒后字符串在顯示一會(huì)兒后就自動(dòng)消失了,而就自動(dòng)消失了,而“”一直顯示在狀態(tài)欄最右端。一直顯示在狀態(tài)欄最右端。 自定義菜單自定義菜單Qt中的中的QWidgetAction類(lèi)可以實(shí)現(xiàn)自定義菜單的功能。為了實(shí)現(xiàn)自類(lèi)可以實(shí)現(xiàn)自定義菜單的功能。為了實(shí)現(xiàn)自定義菜單,需要新建一個(gè)類(lèi),它繼承自定義菜單,需要新建一個(gè)類(lèi),它繼承自QWidgetAction類(lèi),并且在其類(lèi),并且在其中重新實(shí)現(xiàn)中重新實(shí)現(xiàn)createWidget()函

29、數(shù)。函數(shù)。 自學(xué)內(nèi)容:自學(xué)內(nèi)容:寫(xiě)一個(gè)程序,實(shí)現(xiàn)了這樣一個(gè)菜單:它包含一個(gè)標(biāo)簽和一寫(xiě)一個(gè)程序,實(shí)現(xiàn)了這樣一個(gè)菜單:它包含一個(gè)標(biāo)簽和一個(gè)行編輯器,可以在行編輯器中輸入字符串,然后按下回車(chē)鍵,就可個(gè)行編輯器,可以在行編輯器中輸入字符串,然后按下回車(chē)鍵,就可以自動(dòng)將字符串輸入到中心部件文本編輯器中。以自動(dòng)將字符串輸入到中心部件文本編輯器中。 5.2 富文本處理富文本處理 富文本(富文本(Rich TextRich Text)或者叫做富文本格式,簡(jiǎn)單來(lái)說(shuō)就是在)或者叫做富文本格式,簡(jiǎn)單來(lái)說(shuō)就是在文檔中可以使用多種格式,比如字體顏色、圖片和表格等等。它文檔中可以使用多種格式,比如字體顏色、圖片和表格等等

30、。它是與純文本(是與純文本(Plain TextPlain Text)相對(duì)而言的,比如)相對(duì)而言的,比如WindowsWindows上的記事本上的記事本就是純文本編輯器,而就是純文本編輯器,而WordWord就是富文本編輯器。就是富文本編輯器。n富文本文檔結(jié)構(gòu)富文本文檔結(jié)構(gòu) n文本塊文本塊 n表格、列表與圖片表格、列表與圖片 n查找功能查找功能 n語(yǔ)法高亮與語(yǔ)法高亮與HTML HTML 在在Qt中提供了對(duì)富文本處理的支持。中提供了對(duì)富文本處理的支持。Qt中對(duì)富文本的處理分為了編輯操作和中對(duì)富文本的處理分為了編輯操作和只讀操作兩種方式。只讀操作兩種方式。n編輯操作是使用基于光標(biāo)的一些接口函數(shù),這

31、樣更好的模擬了用戶的編輯操編輯操作是使用基于光標(biāo)的一些接口函數(shù),這樣更好的模擬了用戶的編輯操作,更加容易理解,而且不會(huì)丟失底層的文檔框架;作,更加容易理解,而且不會(huì)丟失底層的文檔框架;n而對(duì)于文檔結(jié)構(gòu)的概覽,使用了只讀的分層次的接口函數(shù),它們有利于文檔而對(duì)于文檔結(jié)構(gòu)的概覽,使用了只讀的分層次的接口函數(shù),它們有利于文檔的檢索和輸出。的檢索和輸出。 對(duì)于文檔的讀取和編輯要使用不同方面的兩組接口。對(duì)于文檔的讀取和編輯要使用不同方面的兩組接口。n文檔的光標(biāo)主要基于文檔的光標(biāo)主要基于QTextCursor類(lèi)類(lèi)n文檔的框架主要基于文檔的框架主要基于QTextDocument類(lèi)。類(lèi)。 一個(gè)富文本文檔的結(jié)構(gòu)被

32、分為了幾種元素來(lái)表示,分別是框架一個(gè)富文本文檔的結(jié)構(gòu)被分為了幾種元素來(lái)表示,分別是框架(QTextFrame)、文本塊()、文本塊(QTextBlock)、表格()、表格(QTextTable)和列表)和列表(QTextList)。)。 每種元素的格式又使用相應(yīng)的每種元素的格式又使用相應(yīng)的format類(lèi)來(lái)表示,它們分別是框架格式類(lèi)來(lái)表示,它們分別是框架格式(QTextFrameFormat)、文本塊格式()、文本塊格式(QTextBlockFormat)、表格格式)、表格格式(QTextTableFormat)和列表格式()和列表格式(QTextListFormat),這些格式一般),這些格式

33、一般在編輯文檔時(shí)使用,所以它們常和在編輯文檔時(shí)使用,所以它們常和QTextCursor類(lèi)配合使用。類(lèi)配合使用。 富文本文檔結(jié)構(gòu)富文本文檔結(jié)構(gòu) 因?yàn)橐驗(yàn)镼TextEdit類(lèi)就是一個(gè)富文本編輯器,所以在構(gòu)建類(lèi)就是一個(gè)富文本編輯器,所以在構(gòu)建QTextEdit類(lèi)的對(duì)類(lèi)的對(duì)象時(shí)就已經(jīng)構(gòu)建了一個(gè)象時(shí)就已經(jīng)構(gòu)建了一個(gè)QTextDocument類(lèi)對(duì)象和一個(gè)類(lèi)對(duì)象和一個(gè)QTextCursor類(lèi)對(duì)象,類(lèi)對(duì)象,只需調(diào)用它們進(jìn)行相應(yīng)的操作即可。只需調(diào)用它們進(jìn)行相應(yīng)的操作即可。 一個(gè)空的文檔包含了一個(gè)根框架(一個(gè)空的文檔包含了一個(gè)根框架(Root frame),這個(gè)根框架又包含了),這個(gè)根框架又包含了一個(gè)空的文本塊(

34、一個(gè)空的文本塊(Block)??蚣軐⒁粋€(gè)文檔分為多個(gè)部分,在根框架里可)??蚣軐⒁粋€(gè)文檔分為多個(gè)部分,在根框架里可以再添加文本塊、子框架和表格等。以再添加文本塊、子框架和表格等。 設(shè)置根框架設(shè)置根框架QTextDocument *document = ui-textEdit-document(); /獲取文檔對(duì)象獲取文檔對(duì)象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類(lèi)為文本文檔類(lèi)為文本文檔QTextDocument提供了一個(gè)文本片提供了一個(gè)文本片段(段(QTextFragment)的容器。)的容器。 一個(gè)文本塊可以看做是一個(gè)段落,但是它不能使用回車(chē)換行,因?yàn)橐灰粋€(gè)文本塊可以看做是一個(gè)段落,但是它不能

37、使用回車(chē)換行,因?yàn)橐粋€(gè)回車(chē)換行就表示創(chuàng)建一個(gè)新的文本塊。個(gè)回車(chē)換行就表示創(chuàng)建一個(gè)新的文本塊。QTextBlock提供了只讀接提供了只讀接口,它是前面提到的文檔分層次的接口的一部分,如果口,它是前面提到的文檔分層次的接口的一部分,如果QTextFrame看做是一層,那么其中的看做是一層,那么其中的QTextBlock就是另一層。就是另一層。 文本塊的格式由文本塊的格式由QTextBlockFormat類(lèi)來(lái)處理,它主要涉及對(duì)齊方式,類(lèi)來(lái)處理,它主要涉及對(duì)齊方式,文本塊四周的邊白,縮進(jìn)等內(nèi)容。而文本塊中的文本內(nèi)容的格式,比文本塊四周的邊白,縮進(jìn)等內(nèi)容。而文本塊中的文本內(nèi)容的格式,比如字體大小、加粗、

38、下劃線等內(nèi)容,則由如字體大小、加粗、下劃線等內(nèi)容,則由QTextCharFormat類(lèi)來(lái)設(shè)類(lèi)來(lái)設(shè)置。置。 遍歷框架遍歷框架 QTextDocument *document = ui-textEdit-document(); QTextFrame *frame = document-rootFrame(); QTextFrame:iterator it; / 建立建立QTextFrame類(lèi)的迭代器類(lèi)的迭代器 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(); / 獲取文檔的第一個(gè)文本塊獲取文檔的第一個(gè)文本塊 for (int i = 0; i blockCount(); i+) qDebug() tr(文本塊文本塊%1,文本塊首

40、行行號(hào)為,文本塊首行行號(hào)為:%2,長(zhǎng)度為,長(zhǎng)度為:%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號(hào),加粗,傾斜號(hào),加粗,傾斜 charFormat.setFont(QFont(tr(宋體宋體), 12, QFont:Bold, true); charFormat.setFontUnderline(true); / 使用下劃線使用下劃線 cursor.setCharFormat(charFormat); / 使用字符格式使用字符格式 cursor.insertText(tr

42、(測(cè)試字體測(cè)試字體); / 插入文本插入文本表格、列表和圖片表格、列表和圖片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ù)字編號(hào)數(shù)字編號(hào) 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)建對(duì)話框創(chuàng)建對(duì)話框 l

44、ineEdit = new QLineEdit(dlg); / 創(chuàng)建行編輯器創(chuàng)建行編輯器 QPushButton *btn = new QPushButton(dlg); / 創(chuàng)建按鈕創(chuàng)建按鈕 btn-setText(tr(查找下一個(gè)查找下一個(gè)); connect(btn,SIGNAL(clicked(),this,SLOT(findNext(); / 關(guān)聯(lián)信號(hào)和槽關(guān)聯(lián)信號(hào)和槽 QVBoxLayout *layout = new QVBoxLayout; / 創(chuàng)建垂直布局管理器創(chuàng)建垂直布局管理器 layout-addWidget(lineEdit); / 添加部件添加部件 layout-add

45、Widget(btn); dlg-setLayout(layout); / 在對(duì)話框中使用布局管理器在對(duì)話框中使用布局管理器 dlg-show();n查找下一個(gè)查找下一個(gè) QString string = lineEdit-text(); / 使用查找函數(shù)查找指定字符串,查找方式為向后查找使用查找函數(shù)查找指定字符串,查找方式為向后查找 bool isfind = ui-textEdit-find(string, QTextDocument:FindBackward); if(isfind) / 如果查找成功,輸出字符串所在行和列的編號(hào)如果查找成功,輸出字符串所在行和列的編號(hào) qDebug()

46、textEdit-textCursor().blockNumber() .arg(ui-textEdit-textCursor().columnNumber(); 語(yǔ)法高亮語(yǔ)法高亮 在使用在使用Qt Creator編輯代碼時(shí)可以發(fā)現(xiàn),輸入關(guān)鍵字時(shí)會(huì)顯示不同的顏色,編輯代碼時(shí)可以發(fā)現(xiàn),輸入關(guān)鍵字時(shí)會(huì)顯示不同的顏色,這就是所謂的語(yǔ)法高亮。這就是所謂的語(yǔ)法高亮。 在在Qt的富文本處理中提供了的富文本處理中提供了QSyntaxHighlighter類(lèi)來(lái)實(shí)現(xiàn)語(yǔ)法高亮。為了實(shí)類(lèi)來(lái)實(shí)現(xiàn)語(yǔ)法高亮。為了實(shí)現(xiàn)這個(gè)功能,需要?jiǎng)?chuàng)建現(xiàn)這個(gè)功能,需要?jiǎng)?chuàng)建QSyntaxHighlighter類(lèi)的子類(lèi),然后重新實(shí)現(xiàn)類(lèi)的子類(lèi),

47、然后重新實(shí)現(xiàn)highlightBlock()函數(shù),使用時(shí)直接將函數(shù),使用時(shí)直接將QTextDocument類(lèi)對(duì)象指針作為其父類(lèi)對(duì)象指針作為其父部件指針,這樣就可以自動(dòng)調(diào)用部件指針,這樣就可以自動(dòng)調(diào)用highlightBlock()函數(shù)了。函數(shù)了。 例如,自定義的類(lèi)為例如,自定義的類(lèi)為MySyntaxHighlighter,像這樣來(lái)使用:,像這樣來(lái)使用: highlighter = new MySyntaxHighlighter(ui-textEdit-document(); 這里創(chuàng)建了這里創(chuàng)建了MySyntaxHighlighter類(lèi)的對(duì)象,并且使用編輯器的文檔對(duì)象指針作為其類(lèi)的對(duì)象,并且使用

48、編輯器的文檔對(duì)象指針作為其參數(shù),這樣,每當(dāng)編輯器中的文本改變時(shí)都會(huì)調(diào)用參數(shù),這樣,每當(dāng)編輯器中的文本改變時(shí)都會(huì)調(diào)用highlightBlock()函數(shù)來(lái)設(shè)置語(yǔ)法函數(shù)來(lái)設(shè)置語(yǔ)法高亮。高亮。 重新實(shí)現(xiàn)重新實(shí)現(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)建正則表達(dá)式創(chuàng)建正則表達(dá)式 int index = text.indexOf(expression); / 從位置從位置0開(kāi)始匹配字符串開(kāi)始匹配字符串 / 如果匹配成功,那么返回值為字符串的起始位置,它大于或等于如果匹配成功,那么返回值為字符串的起始位置,它大于或等于0 while (index = 0) int length = expression.matchedLength(); / 要匹配字符串的長(zhǎng)度要匹配字符串的長(zhǎng)度 setFormat(index, length, myFormat); / 對(duì)要匹配的字符串設(shè)置格式對(duì)要匹配的字符串設(shè)置格

50、式 index = text.indexOf(expression, index + length); / 繼續(xù)匹配繼續(xù)匹配 在這里主要是使用了正則表達(dá)式和在這里主要是使用了正則表達(dá)式和QString類(lèi)的類(lèi)的indexOf()函數(shù)來(lái)函數(shù)來(lái)進(jìn)行字符串的匹配,如果匹配成功,則使用進(jìn)行字符串的匹配,如果匹配成功,則使用QSyntaxHighlighter類(lèi)的類(lèi)的setFormat()函數(shù)來(lái)設(shè)置字符格式。函數(shù)來(lái)設(shè)置字符格式。 HTML 在富文本處理中還提供了對(duì)在富文本處理中還提供了對(duì)HTML子集的支持,可以在子集的支持,可以在QLabel或者或者QTextEdit添加文本時(shí)使用添加文本時(shí)使用HTML標(biāo)

51、簽或者標(biāo)簽或者CSS屬性,例如:屬性,例如: ui-textEdit-append(tr(使用使用HTML); 這里往編輯器中添加了文本,并且使用了這里往編輯器中添加了文本,并且使用了HTML標(biāo)簽,標(biāo)簽, 5.3 拖放操作拖放操作 對(duì)于一個(gè)實(shí)用的應(yīng)用程序,我們不僅希望能從文件菜單中打開(kāi)一個(gè)對(duì)于一個(gè)實(shí)用的應(yīng)用程序,我們不僅希望能從文件菜單中打開(kāi)一個(gè)文件,更希望可以通過(guò)拖動(dòng),直接將桌面上的文件拖入程序界面上文件,更希望可以通過(guò)拖動(dòng),直接將桌面上的文件拖入程序界面上來(lái)打開(kāi),就像可以將來(lái)打開(kāi),就像可以將.文件拖入文件拖入Qt CreatorQt Creator中來(lái)打開(kāi)整個(gè)項(xiàng)目一中來(lái)打開(kāi)整

52、個(gè)項(xiàng)目一樣。樣。QtQt中提供了強(qiáng)大的拖放機(jī)制,拖放操作分為拖動(dòng)(中提供了強(qiáng)大的拖放機(jī)制,拖放操作分為拖動(dòng)(DragDrag)和放)和放下(下(DropDrop)兩種操作。當(dāng)數(shù)據(jù)被拖動(dòng)時(shí)會(huì)被存儲(chǔ)為)兩種操作。當(dāng)數(shù)據(jù)被拖動(dòng)時(shí)會(huì)被存儲(chǔ)為MIME MIME (Multipurpose Internet Mail Extensions)(Multipurpose Internet Mail Extensions)類(lèi)型,在類(lèi)型,在QtQt中使用中使用QMimeDataQMimeData類(lèi)來(lái)表示類(lèi)來(lái)表示MIMEMIME類(lèi)型的數(shù)據(jù),并使用類(lèi)型的數(shù)據(jù),并使用QDragQDrag類(lèi)來(lái)完成數(shù)據(jù)的類(lèi)來(lái)完成數(shù)據(jù)的轉(zhuǎn)移

53、,而整個(gè)拖放操作都是在幾個(gè)鼠標(biāo)事件和拖放事件中完成的。轉(zhuǎn)移,而整個(gè)拖放操作都是在幾個(gè)鼠標(biāo)事件和拖放事件中完成的。n使用拖放打開(kāi)文件使用拖放打開(kāi)文件 n自定義拖放操作自定義拖放操作 使用拖放打開(kāi)文件使用拖放打開(kāi)文件例如:將桌面上的例如:將桌面上的txt文本文件拖入自己編寫(xiě)的程序中來(lái)打開(kāi)。使用拖放文本文件拖入自己編寫(xiě)的程序中來(lái)打開(kāi)。使用拖放需要聲明兩個(gè)函數(shù):需要聲明兩個(gè)函數(shù):protected: void dragEnterEvent(QDragEnterEvent *event); / 拖動(dòng)進(jìn)入事件拖動(dòng)進(jìn)入事件 void dropEvent(QDropEvent *event); / 放下事件放

54、下事件拖入操作拖入操作void MainWindow:dragEnterEvent(QDragEnterEvent *event) / 進(jìn)入事件進(jìn)入事件 if(event-mimeData()-hasUrls() / 數(shù)據(jù)中是否包含數(shù)據(jù)中是否包含URL event-acceptProposedAction(); / 如果是則接收動(dòng)作如果是則接收動(dòng)作 else event-ignore(); / 否則忽略該事件否則忽略該事件 當(dāng)鼠標(biāo)拖拽一個(gè)數(shù)據(jù)進(jìn)入主窗口時(shí),就會(huì)觸發(fā)當(dāng)鼠標(biāo)拖拽一個(gè)數(shù)據(jù)進(jìn)入主窗口時(shí),就會(huì)觸發(fā)dragEventEvent()事件處理函事件處理函數(shù),獲取其中的數(shù),獲取其中的MIME數(shù)據(jù)

55、,然后查看它是否包含數(shù)據(jù),然后查看它是否包含URL路徑,因?yàn)橥先氲奈穆窂?,因?yàn)橥先氲奈谋疚募?shí)際上就是拖入了它的路徑,這就是本文件實(shí)際上就是拖入了它的路徑,這就是event-mimeData()-hasUrls()實(shí)現(xiàn)的功能。如果有這樣的數(shù)據(jù),就接收它,否則就忽略該事件。實(shí)現(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列表列表 / 將其中第一個(gè)將其中第一個(gè)URL表示為本地文件路徑表示為本地文件路徑 QString fileName = urlList.at(0).toLocalFile(); if(!fileName.isEmpty() / 如果文件路徑不為空如果文件路徑不為空 QFile file(fileName); / 建立建立QFile對(duì)象并且以只讀方式打開(kāi)該文件對(duì)象并且以只讀方式打開(kāi)該文件 if(!file.open(QIODevice:ReadOn

57、ly) return; QTextStream in(&file); / 建立文本流對(duì)象建立文本流對(duì)象 ui-textEdit-setText(in.readAll(); / 將文件中所有內(nèi)容讀入編輯器將文件中所有內(nèi)容讀入編輯器 當(dāng)松開(kāi)鼠標(biāo)左鍵,將數(shù)據(jù)放入主窗口時(shí)就會(huì)觸發(fā)當(dāng)松開(kāi)鼠標(biāo)左鍵,將數(shù)據(jù)放入主窗口時(shí)就會(huì)觸發(fā)dropEvent()事件處理函數(shù),這事件處理函數(shù),這里獲取了里獲取了MIME數(shù)據(jù)中的數(shù)據(jù)中的URL列表,因?yàn)橥先氲闹挥幸粋€(gè)文件,所以獲取了列表列表,因?yàn)橥先氲闹挥幸粋€(gè)文件,所以獲取了列表中的第一個(gè)條目,并使用中的第一個(gè)條目,并使用toLocalFile()函數(shù)將它轉(zhuǎn)換為本地文

58、件路徑。然后使用函數(shù)將它轉(zhuǎn)換為本地文件路徑。然后使用QFile和和QTextStream將文件中的數(shù)據(jù)讀入編輯器中。將文件中的數(shù)據(jù)讀入編輯器中。MIME類(lèi)型數(shù)據(jù)處理函數(shù)類(lèi)型數(shù)據(jù)處理函數(shù) 在在QMimeData類(lèi)中提供了幾個(gè)函數(shù)來(lái)方便的處理常見(jiàn)的類(lèi)中提供了幾個(gè)函數(shù)來(lái)方便的處理常見(jiàn)的MIME數(shù)據(jù)數(shù)據(jù) :自定義拖放操作自定義拖放操作 下面以在窗口中拖動(dòng)圖片為例,需要聲明以下幾個(gè)函數(shù):下面以在窗口中拖動(dòng)圖片為例,需要聲明以下幾個(gè)函數(shù):protected: void mousePressEvent(QMouseEvent *event); / 鼠標(biāo)按下事件鼠標(biāo)按下事件 void dragEnterEve

59、nt(QDragEnterEvent *event); / 拖動(dòng)進(jìn)入事件拖動(dòng)進(jìn)入事件 void dragMoveEvent(QDragMoveEvent *event); / 拖動(dòng)事件拖動(dòng)事件 void dropEvent(QDropEvent *event); / 放下事件放下事件nmousePressEvent: 為拖動(dòng)圖片做準(zhǔn)備工作,將圖片數(shù)據(jù)放到自定義的為拖動(dòng)圖片做準(zhǔn)備工作,將圖片數(shù)據(jù)放到自定義的MIME類(lèi)型中。類(lèi)型中。ndragEnterEvent: 開(kāi)始拖動(dòng),先判斷是否包含需要移動(dòng)的類(lèi)型。開(kāi)始拖動(dòng),先判斷是否包含需要移動(dòng)的類(lèi)型。ndragMoveEvent:拖動(dòng)過(guò)程。:拖動(dòng)過(guò)程。n

60、dropEvent:放下圖片,創(chuàng)建新的圖片放到光標(biāo)處。:放下圖片,創(chuàng)建新的圖片放到光標(biāo)處。 當(dāng)鼠標(biāo)按下時(shí)當(dāng)鼠標(biāo)按下時(shí)會(huì)觸發(fā)鼠標(biāo)按下事件,進(jìn)而執(zhí)行其處理函數(shù),在這里進(jìn)行了一系列操作,大體上可以會(huì)觸發(fā)鼠標(biāo)按下事件,進(jìn)而執(zhí)行其處理函數(shù),在這里進(jìn)行了一系列操作,大體上可以分為六步。分為六步。n第一步,先獲取鼠標(biāo)指針?biāo)谔幍牟考闹羔?,將它?qiáng)制轉(zhuǎn)換為第一步,先獲取鼠標(biāo)指針?biāo)谔幍牟考闹羔槪瑢⑺鼜?qiáng)制轉(zhuǎn)換為QLabel類(lèi)型的指針,然后使用類(lèi)型的指針,然后使用inherits()函數(shù)判斷它是否是函數(shù)判斷它是否是QLabel類(lèi)型,如果不是則直接返回,不再進(jìn)行下面的操作。類(lèi)型,如果不是則直接返回,不再進(jìn)行下面的操作。n第二步,因?yàn)椴粌H要在拖動(dòng)的數(shù)據(jù)中包含圖片數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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)論