版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《QtCreator快速入門》第2版第5章應(yīng)用程序主窗口(3課時(shí))這一章開(kāi)始接觸應(yīng)用程序主窗口的相關(guān)內(nèi)容。對(duì)于日常見(jiàn)到的應(yīng)用程序而言,它們中的許多都是基于主窗口的,主窗口中包含了菜單欄、工具欄、狀態(tài)欄和中心區(qū)域等。本章會(huì)詳細(xì)介紹主窗口的每一個(gè)部分,還會(huì)涉及到資源管理、富文本處理、拖放操作和文檔打印等相關(guān)內(nèi)容。在Qt中提供了以QMainWindow類為核心的主窗口框架,它包含了眾多相關(guān)的類:主要內(nèi)容5.1主窗口框架(第1課時(shí))5.2富文本處理(第2課時(shí))5.3拖放操作(第3課時(shí))5.4打印文檔(第3課時(shí))5.5小結(jié)(第3課時(shí))5.1主窗口框架菜單欄和工具欄使用資源系統(tǒng)中心部件Dock部件狀態(tài)欄自定義菜單主窗口為建立應(yīng)用程序用戶界面提供了一個(gè)框架,Qt提供了QMainWindow和與其相關(guān)的一些類來(lái)進(jìn)行主窗口的管理。QMainWindow類擁有自己的布局:①菜單欄(QMenuBar)。菜單欄包含了一個(gè)下拉菜單項(xiàng)的列表,這些菜單項(xiàng)由QAction動(dòng)作類實(shí)現(xiàn)。菜單欄位于主窗口的頂部,一個(gè)主窗口只能有一個(gè)菜單欄。②工具欄(QToolBar)。工具欄一般用于顯示一些常用的菜單項(xiàng)目,它也可以插入其他窗口部件,并且工具欄是可以移動(dòng)的。一個(gè)主窗口可以擁有多個(gè)工具欄。③中心部件(CentralWidget)。在主窗口的中心區(qū)域可以放入一個(gè)窗口部件作為中心部件,它是應(yīng)用程序的主要功能實(shí)現(xiàn)區(qū)域。一個(gè)主窗口只能擁有一個(gè)中心部件。④Dock部件(QDockWidget)。Dock部件常被稱為停靠窗口,因?yàn)樗梢酝?吭谥行牟考乃闹?。它用?lái)放置一些部件來(lái)實(shí)現(xiàn)一些功能,就像個(gè)工具箱一樣。一個(gè)主窗口可以擁有多個(gè)Dock部件。⑤狀態(tài)欄(QStatusBar)。狀態(tài)欄用于顯示程序的一些狀態(tài)信息,它在主窗口的最底部。一個(gè)主窗口只能擁有一個(gè)狀態(tài)欄。在設(shè)計(jì)器中給菜單欄、工具欄添加動(dòng)作
在QtCreator中雙擊項(xiàng)目中的.ui文件進(jìn)入設(shè)計(jì)模式。添加菜單,雙擊左上角的“在這里輸入”,修改為“文件(&F)”,這里要使用英文半角的括號(hào),“&F”被稱為加速鍵,表明程序運(yùn)行時(shí),可以按下Alt+F鍵來(lái)激活該菜單。修改完成后,按下回車鍵,并在彈出的下拉菜單中,將第一項(xiàng)改為“新建文件(&N)”并按下回車鍵。這時(shí)可以看到在下面的Action編輯器中已經(jīng)有了“新建文件”動(dòng)作。在這里用鼠標(biāo)點(diǎn)擊該動(dòng)作,將其拖入菜單欄下面的工具欄中。菜單欄QMenuBar類提供了一個(gè)水平的菜單欄,在QMainWindow中可以直接獲取它的默認(rèn)存在的菜單欄,向其中添加QMenu類型的菜單對(duì)象,然后向彈出菜單中添加QAction類型的動(dòng)作對(duì)象。在QMenu中還提供了間隔器,可以在設(shè)計(jì)器中向添加菜單那樣直接添加間隔器,或者在代碼中使用addSeparator()函數(shù)來(lái)添加,它是一條水平線,可以將菜單分成幾組,使得布局很整齊。在應(yīng)用程序中很多普通的命令都是通過(guò)菜單來(lái)實(shí)現(xiàn)的,而我們也希望能將這些菜單命令放到工具欄中,以方便使用。QAction就是這樣一種命令動(dòng)作,它可以同時(shí)放在菜單和工具欄中。一個(gè)QAction動(dòng)作包含了一個(gè)圖標(biāo),一個(gè)菜單顯示文本,一個(gè)快捷鍵,一個(gè)狀態(tài)欄顯示文本,一個(gè)“What’sThis?”顯示文本和一個(gè)工具提示文本。這些都可以在構(gòu)建QAction類對(duì)象時(shí)在構(gòu)造函數(shù)中指定。另外還可以設(shè)置QAction的checkable屬性,如果指定這個(gè)動(dòng)作的checkable為true,那么當(dāng)選中這個(gè)菜單時(shí)就會(huì)在它的前面顯示“√”之類的表示選中狀態(tài)的符號(hào),如果該菜單有圖標(biāo),那么就會(huì)用線框?qū)D標(biāo)圍住,用來(lái)表示該動(dòng)作被選中了。代碼方式添加菜單//添加編輯菜單QMenu*editMenu=ui->menuBar->addMenu(tr("編輯(&E)"));//添加打開(kāi)菜單QAction*action_Open=editMenu->addAction(QIcon(“../images/open.png"),tr("打開(kāi)文件(&O)"));//設(shè)置快捷鍵action_Open->setShortcut(QKeySequence("Ctrl+O"));//在工具欄中添加動(dòng)作ui->mainToolBar->addAction(action_Open);
工具欄工具欄QToolBar類提供了一個(gè)包含了一組控件的可以移動(dòng)的面板。在上面已經(jīng)看到可以將QAction對(duì)象添加到工具欄中,它默認(rèn)只是顯示一個(gè)動(dòng)作的圖標(biāo),這個(gè)可以在QToolBar的屬性欄中進(jìn)行更改。在設(shè)計(jì)器中可以查看QToolBar的屬性欄,其中toolButtonStyle屬性設(shè)置圖標(biāo)和相應(yīng)文本的顯示及其相對(duì)位置等;movabel屬性設(shè)置狀態(tài)欄是否可以移動(dòng);allowedArea設(shè)置允許停靠的位置;iconsize屬性設(shè)置圖標(biāo)的大?。籪loatable屬性設(shè)置是否可以懸浮。在工具欄中添加部件QToolButton*toolBtn=newQToolButton(this);//創(chuàng)建QToolButtontoolBtn->setText(tr("顏色"));QMenu*colorMenu=newQMenu(this);//創(chuàng)建一個(gè)菜單colorMenu->addAction(tr("紅色"));colorMenu->addAction(tr("綠色"));toolBtn->setMenu(colorMenu);//添加菜單toolBtn->setPopupMode(QToolButton::MenuButtonPopup);//設(shè)置彈出模式ui->mainToolBar->addWidget(toolBtn);//向工具欄添加QToolButton按鈕QSpinBox*spinBox=newQSpinBox(this);//創(chuàng)建QSpinBoxui->mainToolBar->addWidget(spinBox);//向工具欄添加QSpinBox部件資源系統(tǒng)Qt資源系統(tǒng)是一個(gè)獨(dú)立于平臺(tái)的(跟使用的操作系統(tǒng)無(wú)關(guān))用于在可執(zhí)行文件中存儲(chǔ)二進(jìn)制文件的機(jī)制??梢宰屝枰奈募▓D片、文本等)包含到程序編程生成的可執(zhí)行文件(例如exe文件)中。保證了程序中使用的文件不會(huì)丟失、不會(huì)因?yàn)榇娣怕窂蕉鴮?dǎo)致程序運(yùn)行錯(cuò)誤。在QtCreator中添加資源第一步,添加Qt資源文件。往項(xiàng)目中添加新文件,選擇Qt分類中的Qt資源文件,文件名稱改為“myImage”,其他選項(xiàng)默認(rèn)即可。第二步,添加資源。建立好資源文件后會(huì)默認(rèn)進(jìn)入資源管理界面,就是新建的myImage.qrc文件中。現(xiàn)在先到項(xiàng)目文件夾myMainWindow中新建一個(gè)名為“images”的文件夾,并在其中放入兩張圖標(biāo)圖片,比如這里放入了一個(gè)“new.png”和一個(gè)“open.png”圖片。(注意:Qt的資源系統(tǒng)要求資源文件必須放在與qrc文件同級(jí)或子級(jí)目錄下,如果放在其他地方,當(dāng)添加資源時(shí)會(huì)提示將文件復(fù)制到有效的位置。)然后回到QtCreator中,在資源管理界面,按下“添加”按鈕,選擇“添加前綴”,然后將屬性欄中的前綴改為“/myImage”,再點(diǎn)擊“添加”按鈕,選擇“添加文件”,在彈出的對(duì)話框中進(jìn)入到前面新建的images文件夾中,選中那兩張圖片,點(diǎn)擊打開(kāi)即可。這時(shí)myImage.qrc文件中就出現(xiàn)了添加的圖片的列表。最后按下Ctrl+S快捷鍵,保存對(duì)文件的修改(注意:這一點(diǎn)很重要,如果沒(méi)有保存,在下面使用圖片時(shí)將看不到圖片)。第三步,使用圖片。在設(shè)計(jì)模式Action編輯器中雙擊“新建文件”動(dòng)作,這時(shí)會(huì)彈出編輯動(dòng)作對(duì)話框。在其中將對(duì)象名稱改為“action_New”,工具提示改為“新建文件”,然后按下圖標(biāo)后面的按鈕,進(jìn)入選擇資源界面。第一次進(jìn)入該界面還沒(méi)有顯示可用的資源,需要按下左上角的重新加載綠色箭頭圖標(biāo),這時(shí)圖片資源就顯示出來(lái)了。這里選擇new.png圖片,然后按下確定按鈕。如果在編寫代碼時(shí)使用new.png圖片,那么就可以將其路徑指定為“:/myImage/images/new.png”,前綴“/myImage”是添加資源時(shí)手動(dòng)設(shè)置的。資源文件介紹在使用資源時(shí)添加的qrc資源文件其實(shí)是一個(gè)XML格式的文本文件,進(jìn)入編輯模式,在myImage.qrc文件上點(diǎn)擊鼠標(biāo)右鍵,選擇“用…打開(kāi)”→“PlainTextEditor”,這時(shí)就會(huì)看到myImage.qrc的內(nèi)容如下:<RCC><qresourceprefix="/myImage"><file>images/new.png</file><file>images/open.png</file></qresource></RCC>在這里指明了文件類型為RCC,表明是Qt資源文件。然后是資源前綴,在下面羅列了添加的圖片的路徑。當(dāng)往項(xiàng)目中添加了一個(gè)資源文件時(shí),會(huì)自動(dòng)往工程文件myMainW中添加代碼:RESOURCES+=\myImage.qrc這表明項(xiàng)目中使用了資源文件myImage.qrc。中心部件在主窗口的中心區(qū)域可以放置一個(gè)中心部件,它一般是一個(gè)編輯器或者瀏覽器。這里支持單文檔部件,也支持多文檔部件。一般的,會(huì)在這里放置一個(gè)部件,然后使用布局管理器使其充滿整個(gè)中心區(qū)域,并可以隨著窗口的大小變化而改變大小。例如在設(shè)計(jì)模式中,往中心區(qū)域拖入一個(gè)TextEdit,然后點(diǎn)擊界面,按下Ctrl+G使其處于一個(gè)柵格布局中。效果如下。Dock部件QDockWidget類提供了這樣一個(gè)部件,它可以停靠在QMainWindow中也可以懸浮起來(lái)作為桌面頂級(jí)窗口,我們稱它為Dock部件或者停靠窗口。Dock部件一般用于存放其他一些部件來(lái)實(shí)現(xiàn)一些特殊功能,就像一個(gè)工具箱一樣。它在主窗口中可以??吭谥行牟考乃闹?,也可以懸浮起來(lái),被拖動(dòng)到任意的地方,還可以被關(guān)閉或隱藏起來(lái)。一個(gè)Dock部件包含一個(gè)標(biāo)題欄和一個(gè)內(nèi)容區(qū)域,可以向Dock部件中放入任何部件。
例如:在設(shè)計(jì)模式中向中心區(qū)域拖入一個(gè)DockWidget部件,然后再向Dock中隨意拖入幾個(gè)部件,比如這里拖入一個(gè)PushButton和一個(gè)FontComboBox。然后在dockWidget的屬性欄中更改其windowTitle為“工具箱”。狀態(tài)欄QStatusBar類提供了一個(gè)水平條,用來(lái)顯示狀態(tài)信息。QMainWindow中默認(rèn)提供了一個(gè)狀態(tài)欄。狀態(tài)信息可以被分為三類:臨時(shí)信息,如一般的提示信息;正常信息,如顯示頁(yè)數(shù)和行號(hào);永久信息,如顯示版本號(hào)或者日期??梢允褂胹howMessage()函數(shù)來(lái)顯示一個(gè)臨時(shí)消息,它會(huì)出現(xiàn)在狀態(tài)欄的最左邊。一般用addWidget()函數(shù)添加一個(gè)QLabel到狀態(tài)欄上用于顯示正常信息,它會(huì)生成到狀態(tài)欄的最左邊,可能會(huì)被臨時(shí)消息所掩蓋。如果要顯示永久信息,要使用addPermanentWidget()函數(shù)來(lái)添加一個(gè)如QLabel一樣的可以顯示信息的部件,它會(huì)生成在狀態(tài)欄的最右端,不會(huì)被臨時(shí)消息所掩蓋。在狀態(tài)欄的最右端,還有一個(gè)QSizeGrip部件,用來(lái)調(diào)整窗口的大小,可以使用setSizeGripEnabled()函數(shù)來(lái)禁用它。目前的設(shè)計(jì)器中還不支持直接向狀態(tài)欄中拖放部件,所以需要使用代碼來(lái)生成。例如://顯示臨時(shí)消息,顯示2000毫秒即2秒鐘ui->statusBar->showMessage(tr("歡迎使用多文檔編輯器"),2000);//創(chuàng)建標(biāo)簽,設(shè)置標(biāo)簽樣式并顯示信息,將其以永久部件的形式添加到狀態(tài)欄QLabel*permanent=newQLabel(this);permanent->setFrameStyle(QFrame::Box|QFrame::Sunken);permanent->setText("");ui->statusBar->addPermanentWidget(permanent); 此時(shí)運(yùn)行程序,可以發(fā)現(xiàn)“歡迎使用多文檔編輯器”字符串在顯示一會(huì)兒后就自動(dòng)消失了,而“”一直顯示在狀態(tài)欄最右端。自定義菜單
Qt中的QWidgetAction類可以實(shí)現(xiàn)自定義菜單的功能。為了實(shí)現(xiàn)自定義菜單,需要新建一個(gè)類,它繼承自QWidgetAction類,并且在其中重新實(shí)現(xiàn)createWidget()函數(shù)。自學(xué)內(nèi)容:寫一個(gè)程序,實(shí)現(xiàn)了這樣一個(gè)菜單:它包含一個(gè)標(biāo)簽和一個(gè)行編輯器,可以在行編輯器中輸入字符串,然后按下回車鍵,就可以自動(dòng)將字符串輸入到中心部件文本編輯器中。
5.2富文本處理富文本(RichText)或者叫做富文本格式,簡(jiǎn)單來(lái)說(shuō)就是在文檔中可以使用多種格式,比如字體顏色、圖片和表格等等。它是與純文本(PlainText)相對(duì)而言的,比如Windows上的記事本就是純文本編輯器,而Word就是富文本編輯器。富文本文檔結(jié)構(gòu)文本塊表格、列表與圖片查找功能語(yǔ)法高亮與HTML在Qt中提供了對(duì)富文本處理的支持。Qt中對(duì)富文本的處理分為了編輯操作和只讀操作兩種方式。編輯操作是使用基于光標(biāo)的一些接口函數(shù),這樣更好的模擬了用戶的編輯操作,更加容易理解,而且不會(huì)丟失底層的文檔框架;而對(duì)于文檔結(jié)構(gòu)的概覽,使用了只讀的分層次的接口函數(shù),它們有利于文檔的檢索和輸出。
對(duì)于文檔的讀取和編輯要使用不同方面的兩組接口。文檔的光標(biāo)主要基于QTextCursor類文檔的框架主要基于QTextDocument類。一個(gè)富文本文檔的結(jié)構(gòu)被分為了幾種元素來(lái)表示,分別是框架(QTextFrame)、文本塊(QTextBlock)、表格(QTextTable)和列表(QTextList)。每種元素的格式又使用相應(yīng)的format類來(lái)表示,它們分別是框架格式(QTextFrameFormat)、文本塊格式(QTextBlockFormat)、表格格式(QTextTableFormat)和列表格式(QTextListFormat),這些格式一般在編輯文檔時(shí)使用,所以它們常和QTextCursor類配合使用。
富文本文檔結(jié)構(gòu)因?yàn)镼TextEdit類就是一個(gè)富文本編輯器,所以在構(gòu)建QTextEdit類的對(duì)象時(shí)就已經(jīng)構(gòu)建了一個(gè)QTextDocument類對(duì)象和一個(gè)QTextCursor類對(duì)象,只需調(diào)用它們進(jìn)行相應(yīng)的操作即可。一個(gè)空的文檔包含了一個(gè)根框架(Rootframe),這個(gè)根框架又包含了一個(gè)空的文本塊(Block)。框架將一個(gè)文檔分為多個(gè)部分,在根框架里可以再添加文本塊、子框架和表格等。
設(shè)置根框架QTextDocument*document=ui->textEdit->document();//獲取文檔對(duì)象QTextFrame*rootFrame=document->rootFrame();//獲取根框架QTextFrameFormatformat;//創(chuàng)建框架格式format.setBorderBrush(Qt::red);//邊界顏色format.setBorder(3);//邊界寬度rootFrame->setFrameFormat(format);//框架使用格式添加子框架QTextFrameFormatframeFormat;frameFormat.setBackground(Qt::lightGray);//設(shè)置背景顏色frameFormat.setMargin(10);//設(shè)置邊距frameFormat.setPadding(5);//設(shè)置填襯frameFormat.setBorder(2);//設(shè)置邊框樣式frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);QTextCursorcursor=ui->textEdit->textCursor();//獲取光標(biāo)cursor.insertFrame(frameFormat);//在光標(biāo)處插入框架文本塊 文本塊QTextBlock類為文本文檔QTextDocument提供了一個(gè)文本片段(QTextFragment)的容器。一個(gè)文本塊可以看做是一個(gè)段落,但是它不能使用回車換行,因?yàn)橐粋€(gè)回車換行就表示創(chuàng)建一個(gè)新的文本塊。QTextBlock提供了只讀接口,它是前面提到的文檔分層次的接口的一部分,如果QTextFrame看做是一層,那么其中的QTextBlock就是另一層。文本塊的格式由QTextBlockFormat類來(lái)處理,它主要涉及對(duì)齊方式,文本塊四周的邊白,縮進(jìn)等內(nèi)容。而文本塊中的文本內(nèi)容的格式,比如字體大小、加粗、下劃線等內(nèi)容,則由QTextCharFormat類來(lái)設(shè)置。遍歷框架QTextDocument*document=ui->textEdit->document();QTextFrame*frame=document->rootFrame();QTextFrame::iteratorit;//建立QTextFrame類的迭代器for(it=frame->begin();!(it.atEnd());++it){QTextFrame*childFrame=it.currentFrame();//獲取當(dāng)前框架的指針QTextBlockchildBlock=it.currentBlock();//獲取當(dāng)前文本塊if(childFrame)qDebug()<<"frame";elseif(childBlock.isValid())qDebug()<<"block:"<<childBlock.text();}遍歷子框架QTextDocument*document=ui->textEdit->document();QTextBlockblock=document->firstBlock();//獲取文檔的第一個(gè)文本塊for(inti=0;i<document->blockCount();i++){qDebug()<<tr("文本塊%1,文本塊首行行號(hào)為:%2,長(zhǎng)度為:%3,內(nèi)容為:").arg(i).arg(block.firstLineNumber()).arg(block.length())<<block.text();block=block.next();//獲取下一個(gè)文本塊}編輯文本塊及其內(nèi)容的格式QTextCursorcursor=ui->textEdit->textCursor();QTextBlockFormatblockFormat;//文本塊格式blockFormat.setAlignment(Qt::AlignCenter);//水平居中cursor.insertBlock(blockFormat);//使用文本塊格式QTextCharFormatcharFormat;//字符格式charFormat.setBackground(Qt::lightGray);//背景色charFormat.setForeground(Qt::blue);//字體顏色//使用宋體,12號(hào),加粗,傾斜charFormat.setFont(QFont(tr("宋體"),12,QFont::Bold,true));charFormat.setFontUnderline(true);//使用下劃線cursor.setCharFormat(charFormat);//使用字符格式cursor.insertText(tr("測(cè)試字體"));//插入文本表格、列表和圖片插入表格QTextCursorcursor=ui->textEdit->textCursor();
QTextTableFormatformat;//表格格式format.setCellSpacing(2);//表格外邊白format.setCellPadding(10);//表格內(nèi)邊白cursor.insertTable(2,2,format);//插入2行2列表格插入列表
QTextListFormatformat;//列表格式format.setStyle(QTextListFormat::ListDecimal);//數(shù)字編號(hào)ui->textEdit->textCursor().insertList(format);插入圖片
QTextImageFormatformat;//圖片格式format.setName("logo.png");//圖片路徑ui->textEdit->textCursor().insertImage(format);查找功能查找文本QDialog*dlg=newQDialog(this);//創(chuàng)建對(duì)話框lineEdit=newQLineEdit(dlg);//創(chuàng)建行編輯器QPushButton*btn=newQPushButton(dlg);//創(chuàng)建按鈕btn->setText(tr("查找下一個(gè)"));connect(btn,SIGNAL(clicked()),this,SLOT(findNext()));//關(guān)聯(lián)信號(hào)和槽QVBoxLayout*layout=newQVBoxLayout;//創(chuàng)建垂直布局管理器layout->addWidget(lineEdit);//添加部件layout->addWidget(btn);dlg->setLayout(layout);//在對(duì)話框中使用布局管理器dlg->show();查找下一個(gè)QStringstring=lineEdit->text();//使用查找函數(shù)查找指定字符串,查找方式為向后查找boolisfind=ui->textEdit->find(string,QTextDocument::FindBackward);if(isfind){//如果查找成功,輸出字符串所在行和列的編號(hào)qDebug()<<tr("行號(hào):%1列號(hào):%2").arg(ui->textEdit->textCursor().blockNumber()).arg(ui->textEdit->textCursor().columnNumber());}語(yǔ)法高亮
在使用QtCreator編輯代碼時(shí)可以發(fā)現(xiàn),輸入關(guān)鍵字時(shí)會(huì)顯示不同的顏色,這就是所謂的語(yǔ)法高亮。在Qt的富文本處理中提供了QSyntaxHighlighter類來(lái)實(shí)現(xiàn)語(yǔ)法高亮。為了實(shí)現(xiàn)這個(gè)功能,需要?jiǎng)?chuàng)建QSyntaxHighlighter類的子類,然后重新實(shí)現(xiàn)highlightBlock()函數(shù),使用時(shí)直接將QTextDocument類對(duì)象指針作為其父部件指針,這樣就可以自動(dòng)調(diào)用highlightBlock()函數(shù)了。
例如,自定義的類為MySyntaxHighlighter,像這樣來(lái)使用:highlighter=newMySyntaxHighlighter(ui->textEdit->document());這里創(chuàng)建了MySyntaxHighlighter類的對(duì)象,并且使用編輯器的文檔對(duì)象指針作為其參數(shù),這樣,每當(dāng)編輯器中的文本改變時(shí)都會(huì)調(diào)用highlightBlock()函數(shù)來(lái)設(shè)置語(yǔ)法高亮。
重新實(shí)現(xiàn)highlightBlock()函數(shù):QTextCharFormatmyFormat;//字符格式myFormat.setFontWeight(QFont::Bold);myFormat.setForeground(Qt::green);QStringpattern="\\bchar\\b";//要匹配的字符,這里是“char”單詞QRegExpexpression(pattern);//創(chuàng)建正則表達(dá)式intindex=text.indexOf(expression);//從位置0開(kāi)始匹配字符串//如果匹配成功,那么返回值為字符串的起始位置,它大于或等于0while(index>=0){intlength=expression.matchedLength();//要匹配字符串的長(zhǎng)度setFormat(index,length,myFormat);//對(duì)要匹配的字符串設(shè)置格式index=text.indexOf(expression,index+length);//繼續(xù)匹配} 在這里主要是使用了正則表達(dá)式和QString類的indexOf()函數(shù)來(lái)進(jìn)行字符串的匹配,如果匹配成功,則使用QSyntaxHighlighter類的setFormat()函數(shù)來(lái)設(shè)置字符格式。
HTML在富文本處理中還提供了對(duì)HTML子集的支持,可以在QLabel或者QTextEdit添加文本時(shí)使用HTML標(biāo)簽或者CSS屬性,例如:
ui->textEdit->append(tr("<h1><fontcolor=red>使用HTML</font></h1>"));
這里往編輯器中添加了文本,并且使用了HTML標(biāo)簽,5.3拖放操作對(duì)于一個(gè)實(shí)用的應(yīng)用程序,我們不僅希望能從文件菜單中打開(kāi)一個(gè)文件,更希望可以通過(guò)拖動(dòng),直接將桌面上的文件拖入程序界面上來(lái)打開(kāi),就像可以將.pro文件拖入QtCreator中來(lái)打開(kāi)整個(gè)項(xiàng)目一樣。Qt中提供了強(qiáng)大的拖放機(jī)制,拖放操作分為拖動(dòng)(Drag)和放下(Drop)兩種操作。當(dāng)數(shù)據(jù)被拖動(dòng)時(shí)會(huì)被存儲(chǔ)為MIME(MultipurposeInternetMailExtensions)類型,在Qt中使用QMimeData類來(lái)表示MIME類型的數(shù)據(jù),并使用QDrag類來(lái)完成數(shù)據(jù)的轉(zhuǎn)移,而整個(gè)拖放操作都是在幾個(gè)鼠標(biāo)事件和拖放事件中完成的。使用拖放打開(kāi)文件自定義拖放操作
使用拖放打開(kāi)文件例如:將桌面上的txt文本文件拖入自己編寫的程序中來(lái)打開(kāi)。使用拖放需要聲明兩個(gè)函數(shù):protected:voiddragEnterEvent(QDragEnterEvent*event);//拖動(dòng)進(jìn)入事件voiddropEvent(QDropEvent*event);//放下事件拖入操作voidMainWindow::dragEnterEvent(QDragEnterEvent*event)//進(jìn)入事件{if(event->mimeData()->hasUrls())//數(shù)據(jù)中是否包含URLevent->acceptProposedAction();//如果是則接收動(dòng)作elseevent->ignore();//否則忽略該事件}
當(dāng)鼠標(biāo)拖拽一個(gè)數(shù)據(jù)進(jìn)入主窗口時(shí),就會(huì)觸發(fā)dragEventEvent()事件處理函數(shù),獲取其中的MIME數(shù)據(jù),然后查看它是否包含URL路徑,因?yàn)橥先氲奈谋疚募?shí)際上就是拖入了它的路徑,這就是event->mimeData()->hasUrls()實(shí)現(xiàn)的功能。如果有這樣的數(shù)據(jù),就接收它,否則就忽略該事件。放下操作voidMainWindow::dropEvent(QDropEvent*event)//放下事件{constQMimeData*mimeData=event->mimeData();//獲取MIME數(shù)據(jù)if(mimeData->hasUrls()){//如果數(shù)據(jù)中包含URLQList<QUrl>urlList=mimeData->urls();//獲取URL列表//將其中第一個(gè)URL表示為本地文件路徑QStringfileName=urlList.at(0).toLocalFile();if(!fileName.isEmpty()){//如果文件路徑不為空QFilefile(fileName);//建立QFile對(duì)象并且以只讀方式打開(kāi)該文件if(!file.open(QIODevice::ReadOnly))return;QTextStreamin(&file);//建立文本流對(duì)象ui->textEdit->setText(in.readAll());//將文件中所有內(nèi)容讀入編輯器}}}當(dāng)松開(kāi)鼠標(biāo)左鍵,將數(shù)據(jù)放入主窗口時(shí)就會(huì)觸發(fā)dropEvent()事件處理函數(shù),這里獲取了MIME數(shù)據(jù)中的URL列表,因?yàn)橥先氲闹挥幸粋€(gè)文件,所以獲取了列表中的第一個(gè)條目,并使用toLocalFile()函數(shù)將它轉(zhuǎn)換為本地文件路徑。然后使用QFile和QTextStream將文件中的數(shù)據(jù)讀入編輯器中。MIME類型數(shù)據(jù)處理函數(shù)在QMimeData類中提供了幾個(gè)函數(shù)來(lái)方便的處理常見(jiàn)的MIME數(shù)據(jù):自定義拖放操作
下面以在窗口中拖動(dòng)圖片為例,需要聲明以下幾個(gè)函數(shù):protected:voidmousePressEvent(QMouseEvent*event);//鼠標(biāo)按下事件voiddragEnterEvent(QDragEnterEvent*event);//拖動(dòng)進(jìn)入事件voiddragMoveEvent(QDragMoveEvent*event);//拖動(dòng)事件voiddropEvent(QDropEvent*event);//放下事件mousePressEvent:為拖動(dòng)圖片做準(zhǔn)備工作,將圖片數(shù)據(jù)放到自定義的MIME類型中。dragEnterEvent:開(kāi)始拖動(dòng),先判斷是否包含需要移動(dòng)的類型。dragMoveEvent:拖動(dòng)過(guò)程。dropEvent:放下圖片,創(chuàng)建新的圖片放到光標(biāo)處。
當(dāng)鼠標(biāo)按下時(shí)會(huì)觸發(fā)鼠標(biāo)按下事件,進(jìn)而執(zhí)行其處理函數(shù),在這里進(jìn)行了一系列操作,大體上可以分為六步。第一步,先獲取鼠標(biāo)指針?biāo)谔幍牟考闹羔?,將它?qiáng)制轉(zhuǎn)換為QLabel類型的指針,然后使用inherits()函數(shù)判斷它是否是QLabel類型,如果不是則直接返回,不再進(jìn)行下面的操作。第二步,因?yàn)椴粌H要在拖動(dòng)的數(shù)據(jù)中包含圖片數(shù)據(jù),還要包含它的位置信息,所以需要使用自定義的MIME類型。這里使用了QByteArray字節(jié)數(shù)組來(lái)存放圖片數(shù)據(jù)和位置數(shù)據(jù)。然后使用QDataStream類將數(shù)據(jù)寫入數(shù)組中。其中位置信息是當(dāng)前鼠標(biāo)指針的坐標(biāo)減去圖片左上角的坐標(biāo)而得到的差值。第三步,創(chuàng)建了QMimeData類對(duì)象指針,使用了自定義的MIME類型“myimage/png”,將字節(jié)數(shù)組放入QMimeData中。第四步,為了移動(dòng)數(shù)據(jù),必須創(chuàng)建QDrag類對(duì)象,然后為其添加QMimeData數(shù)據(jù)。這里為了在移動(dòng)過(guò)程中一直顯示圖片,需要使用setPixmap()函數(shù)為其設(shè)置圖片。然后使用setHotSpot()函數(shù)指定了鼠標(biāo)在圖片上點(diǎn)擊的位置,這里是相對(duì)于圖片左上角的位置,如果不設(shè)定這個(gè),那么在拖動(dòng)圖片過(guò)程中,指針會(huì)位于圖片的左上角。第五步,在移動(dòng)圖片過(guò)程中希望原來(lái)的圖片有所改變來(lái)表明它正在被操作,所以為其添加了一層陰影。第六步,執(zhí)行拖動(dòng)操作,這需要使用QDrag類的exec()函數(shù)。這個(gè)函數(shù)可以設(shè)定所支持的放下動(dòng)作和默認(rèn)的放下動(dòng)作,比如這里設(shè)置了支持復(fù)制動(dòng)作Qt::CopyAction和移動(dòng)動(dòng)作Qt::MoveAction,并設(shè)置默認(rèn)的動(dòng)作是復(fù)制。這就是說(shuō)拖動(dòng)圖片,可以是移動(dòng)它,也可以是進(jìn)行復(fù)制,而默認(rèn)的是復(fù)制操作,比如使用acceptProposedAction()函數(shù)時(shí)就是使用默認(rèn)的操作。當(dāng)圖片被放下后exec()函數(shù)就會(huì)返回操作類型,這個(gè)返回值由下面要講到的dropEvent()函數(shù)中的設(shè)置決定。這里判斷到底進(jìn)行了什么操作,如果是移動(dòng)操作,那么就刪除原來(lái)的圖片,如果是復(fù)制操作,就恢復(fù)原來(lái)的圖片。voidMainWindow::mousePressEvent(QMouseEvent*event)//鼠標(biāo)按下事件{//第一步:獲取圖片//將鼠標(biāo)指針?biāo)谖恢玫牟考?qiáng)制轉(zhuǎn)換為QLabel類型QLabel*child=static_cast<QLabel*>(childAt(event->pos()));if(!child->inherits("QLabel"))return;//如果部件不是QLabel則直接返回QPixmappixmap=*child->pixmap();//獲取QLabel中的圖片//第二步:自定義MIME類型QByteArrayitemData;//創(chuàng)建字節(jié)數(shù)組QDataStreamdataStream(&itemData,QIODevice::WriteOnly);//創(chuàng)建數(shù)據(jù)流//將圖片信息,位置信息輸入到字節(jié)數(shù)組中dataStream<<pixmap<<QPoint(event->pos()-child->pos());
//第三步:將數(shù)據(jù)放入QMimeData中QMimeData*mimeData=newQMimeData;//創(chuàng)建QMimeData用來(lái)存放要移動(dòng)的數(shù)據(jù)//將字節(jié)數(shù)組放入QMimeData中,這里的MIME類型是我們自己定義的mimeData->setData("myimage/png",itemData);
//第四步:將QMimeData數(shù)據(jù)放入QDrag中QDrag*drag=newQDrag(this);//創(chuàng)建QDrag,它用來(lái)移動(dòng)數(shù)據(jù)drag->setMimeData(mimeData);drag->setPixmap(pixmap);//在移動(dòng)過(guò)程中顯示圖片,若不設(shè)置則默認(rèn)顯示一個(gè)小矩形drag->setHotSpot(event->pos()-child->pos());//拖動(dòng)時(shí)鼠標(biāo)指針的位置不變//第五步:給原圖片添加陰影QPixmaptempPixmap=pixmap;//使原圖片添加陰影QPainterpainter;//創(chuàng)建QPainter,用來(lái)繪制QPixmappainter.begin(&tempPixmap);//在圖片的外接矩形中添加一層透明的淡黑色形成陰影效果painter.fillRect(pixmap.rect(),QColor(127,127,127,127));painter.end();child->setPixmap(tempPixmap);//在移動(dòng)圖片過(guò)程中,讓原圖片添加一層黑色陰影//第六步:執(zhí)行拖放操作if(drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction)==Qt::MoveAction)//設(shè)置拖放可以是移動(dòng)和復(fù)制操作,默認(rèn)是復(fù)制操作child->close();//如果是移動(dòng)操作,那么拖放完成后關(guān)閉原標(biāo)簽else{child->show();//如果是復(fù)制操作,那么拖放完成后顯示標(biāo)簽child->setPixmap(pixmap);//顯示原圖片,不再使用陰影}}voidMainWindow::dragEnterEvent(QDragEnterEvent*event)//拖動(dòng)進(jìn)入事件{//如果有我們定義的MIME類型數(shù)據(jù),則進(jìn)行移動(dòng)操作if(event->mimeData()->hasFormat("myimage/png")){event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();}}voidMainWindow::dragMoveEvent(QDragMoveEvent*event)//拖動(dòng)事件{if(event->mimeData()->hasFormat("myimage/png")){event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();}}voidMainWindow::dropEvent(QDropEvent*event)//放下事件{if(event->mimeData()->hasFormat("myimage/png")){QByteArrayitemData=event->mimeData()->data("myimage/png");QDataStreamdataStream(&itemData,QIODevice::ReadOnly);QPixmappixmap;QPointoffset;//使用數(shù)據(jù)流將字節(jié)數(shù)組中的數(shù)據(jù)讀入到QPixmap和QPoint變量中dataStream>>pixmap>>offset;//新建標(biāo)簽,為其添加圖片,并根據(jù)圖片大小設(shè)置標(biāo)簽的大小QLabel*newLabel=newQLabel(this);newLabel->setPixmap(pixmap);newLabel->resize(pixmap.size());//讓圖片移動(dòng)到放下的位置,不設(shè)置的話,圖片會(huì)默認(rèn)顯示在(0,0)點(diǎn)即窗口左上角newLabel->move(event->pos()-offset);
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)老院老人入住接待制度
- 養(yǎng)老院環(huán)境衛(wèi)生與綠化制度
- 《個(gè)性設(shè)計(jì)模板》課件
- 《目標(biāo)市場(chǎng)定位分析》課件
- 2024年度外聘講師知識(shí)產(chǎn)權(quán)保護(hù)與收益分配合同3篇
- 2024年生態(tài)修復(fù)項(xiàng)目育林施工協(xié)議模板版B版
- 腦卒中康復(fù)治療方案
- 2024年版:戴悅與周日的特許經(jīng)營(yíng)合同
- 2025年莆田貨運(yùn)考試
- 2025年焦作貨運(yùn)資格證模擬考試題
- 2022年中山市房地產(chǎn)市場(chǎng)年度報(bào)告-世聯(lián)研究
- FZ/T 62039-2019機(jī)織嬰幼兒睡袋
- 【人類命運(yùn)共同體論文】淺談“人類命運(yùn)共同體”
- ARCGIS10基礎(chǔ)培訓(xùn)課件
- 課件:第一章 導(dǎo)論(《現(xiàn)代社會(huì)福利思想》課程)
- 構(gòu)型構(gòu)象分析課件
- 第七章-期權(quán)的組合策略-《金融工程》課件
- 見(jiàn)證取樣和送檢見(jiàn)證人員備案表
- 明星志愿3及資料設(shè)定集總攻略打印版
- 鐵路專用線管理模式比較
- (WORD版可修改)JGJ59-2023建筑施工安全檢查標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論