06qt資源不正經(jīng)程序員-基礎(chǔ)教程_第1頁(yè)
06qt資源不正經(jīng)程序員-基礎(chǔ)教程_第2頁(yè)
06qt資源不正經(jīng)程序員-基礎(chǔ)教程_第3頁(yè)
06qt資源不正經(jīng)程序員-基礎(chǔ)教程_第4頁(yè)
06qt資源不正經(jīng)程序員-基礎(chǔ)教程_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余69頁(yè)可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

Qt概 什么是 Qt的發(fā)展 支持的平 Qt版 Qt的與安 地址 Linux OSX Windows 安 Qt的優(yōu) 成功案 創(chuàng)建Qt項(xiàng) 使用向?qū)?chuàng) 手動(dòng)創(chuàng) .pro文 一個(gè)最簡(jiǎn)單的Qt應(yīng)用程 第一個(gè)Qt小程 按鈕的創(chuàng) Qt窗口坐標(biāo)體 信號(hào)和槽機(jī) 自定義信號(hào)和 信號(hào)槽的拓 Qt4版本的信號(hào)槽寫(xiě) Lambda表達(dá) 菜單 .....................................................................................................................狀態(tài) 鉚接部 資源文 6框 基本概 標(biāo)準(zhǔn) 自定義消息 消息 標(biāo)準(zhǔn)文件 布局管理 利用widget做布 常用控 QLabel控件使 顯示文字(普通文本、 顯示....................................................................................................................顯示動(dòng) 其他控 自定義控 Qt消息機(jī)制和事 事 事件過(guò)濾 總 繪圖和繪圖設(shè) 繪圖設(shè) 文件系 基本文件操 二進(jìn)制文件讀 文本文件讀 Qt概Qt是一個(gè)跨平臺(tái)的C++圖形用戶(hù)界面應(yīng)用程序框架它為應(yīng)用程序開(kāi)發(fā)者提供建Qt1991Qt1996LinuxKDE2008,Qt2012QtDigia20144QtCreator3.1.0520Qt5.3QtiOS、Android、WP當(dāng)前Qt版本為5.8.0Windows–XP、Vista、Win7、Win8、Win2008、Uinux/X11–Linux、Sun paqTru64UNIX、IBMAIX、SGIIRIX、FreeBSD、BSD/OS、和其他很多X11平臺(tái)Macintosh–MacOSEmbeddedLinux,WindowsQtQt按照不同的版本,分為商業(yè)版和開(kāi)源LGPLGNU通用公共下,它是免費(fèi)的Qt的與安地址LinuxQt5.5.0forLinux32-bit(535MB) Qt5.5.0forLinux64-bit(532MB) Qt5.5.0forAndroid(Linux64-bit,605MB)Qt5.5.0forAndroid(Linux32-bit,608XQt5.5.0forMac(588 Qt5.5.0forAndroid(Mac,652 Qt5.5.0forAndroidandiOS(Mac,1.7 WindowsQt5.5.0forWindows64-bit(VS2013,650 Qt5.5.0forWindows32-bit(VS2013,633 Qt5.5.0forWindows32-bit(VS2012,587 Qt5.5.0forWindows32-bit(VS2010,585 Qt5.5.0forWindows32-bit(MinGW4.9.2,959 Qt5.5.0forAndroid(Windows32-bit,1.0 Qt5.5.0forWindowsRT32-bit(621 安默認(rèn)安裝(建議組件全部選中 Qt對(duì)不同的平臺(tái)提供了不同版本的安裝包,可根據(jù)實(shí)際情況自行安qt-opensource-windows-x86-mingw482_opengl-5.3.1版QtQTWPSOfficeSkypeEarth谷歌地圖VLC多…創(chuàng)建Qt項(xiàng)QtCreatorNewProject彈出NewProject框,選擇QtWidgets選擇【Choose】按鈕,彈出如 CMainWindowQMainWindowQWidgetQDialogQWidget(類(lèi)似于空窗口UImain.cpp、Qt選擇【choose彈出新建文件在此框中選擇要添加的類(lèi)或者文件,根據(jù)向?qū)瓿晌募奶砑?proQcoreguigreaterThan(QT_MAJOR_VERSION,4):QTwidgetsQt4widgetTARGETQtFirst//應(yīng)用程序名生成的.exeTEMPLATE= SOURCES HEADERS .pro就是工程文件(project),它是qmake自動(dòng)生成的用于生產(chǎn)makefile的配置文件。.pro選擇:TEMPLATE=appapp-建立一個(gè)應(yīng)用程序的makefilelibmakefilevcappVisualStudiovclibVisualStudiosubdirs-這是一個(gè)特殊的模板,它可以創(chuàng)建一個(gè)能夠進(jìn)入特定 為一個(gè)項(xiàng)目文件生成makefile并且為它調(diào)用make的makefile。TARGET=QtDemoHEADERS+=#工程中包含的.uiFORMS+=SOURCES+=sources/main.cppRESOURCESqrc/painter.qrcgreaterThan(QT_MAJOR_VERSION,4):QT+=這條語(yǔ)句的含義是,如果QT_MAJOR_VERSION大于4(也就是當(dāng)前使用的Qt5及更高版本)需要增加widgets模塊。如果項(xiàng)目?jī)H需支持Qt5,也可以直接添加“QT+=widgets”一句。不過(guò)為了保持代碼兼容好還是按照QtCreator成的語(yǔ)句編寫(xiě)。CONFIGqmakeCONFIGc++11c++11“+=,Qtmain函數(shù)#include"widget.h"#include#include"widget.h"#include<QApplication>intmain(intargc,char{QApplicationa(argc,argv);Widgetw;return}Qt系統(tǒng)提供的標(biāo)準(zhǔn)類(lèi)名頭文件沒(méi)有.h后QtQApplication是Qt的整個(gè)管理脈它包含主事件循環(huán)在其中來(lái)自窗口系統(tǒng)和并且提供管理。對(duì)于任何一個(gè)使用Qt的圖形用戶(hù)界面應(yīng)用程序,都正好存在一個(gè)2或個(gè)窗口。程序進(jìn)入消息循環(huán)main()Qt,Qtexec()在exec()中,Qt接受并處理用戶(hù)和系統(tǒng)的事件并且把它們傳遞給適當(dāng)?shù)拇翱诓考?。第一個(gè)Qt小程QPushButtonQPushButton*btnnewQPushButton;頭文件#includebtn-btn->setText("btn-QPushButton*btn2=newthis-this->setWindowTitlethis-QPushButtonsetParentsetTextmovesetWindowTitle,重新指定窗口大小:resize,setFixedSize;QtParentQObject當(dāng)你創(chuàng)建一個(gè)QObject對(duì)象時(shí),會(huì)看到QObjectQObjectparent,這相當(dāng)于,在創(chuàng)建QObject對(duì)象時(shí),可以提供一個(gè)其父對(duì)象,我們創(chuàng)建的這個(gè)QObject會(huì)自動(dòng)添加到其父對(duì)象的children()列表。)這種機(jī)制在GUI程序設(shè)計(jì)中相當(dāng)有用。例如,一個(gè)按鈕有一個(gè)QWidgetQWidget繼承自QObject,因此也繼承了這種對(duì)象樹(shù)關(guān)系。一個(gè)孩子自被父組件的邊界剪裁。例如,當(dāng)用戶(hù)關(guān)閉一個(gè)框的時(shí)候,應(yīng)用程序?qū)⑵鋭h除,那么,我們希望屬于這個(gè)框的按鈕、圖標(biāo)等應(yīng)該一起被刪除。事實(shí)就是如此,因?yàn)檫@些都是框的子組件。比如,當(dāng)我們刪除了一個(gè)時(shí),其所在的主窗口會(huì)自動(dòng)將該從其子對(duì)象列表中刪除,并且自動(dòng)調(diào)整屏幕顯示。QtQObjectQtQObjectdeleteparent,則自動(dòng)將其從parent的children()列表中刪除;如果有孩子,則自動(dòng)deleteQtQObjectdelete{QWidget{QWidget}windowquitQObject(們都是QWidget的子類(lèi),而QWidget是QObject的子類(lèi)。這段代碼是正確的,quitC++要求,局部對(duì)象的析構(gòu)順序應(yīng)該按照其創(chuàng)建順序的相反過(guò)程quit的析構(gòu)函數(shù),將其從父對(duì)象window的子對(duì)象列表中刪除,然后才會(huì)再調(diào)用window的析構(gòu)函數(shù)。{{QPushButtonquit("Quit");QWidgetwindow;}象的window會(huì)首先被析構(gòu),因?yàn)樗亲詈笠粋€(gè)創(chuàng)建的對(duì)象。在析構(gòu)過(guò)程中,它quit然后,代碼繼續(xù)執(zhí)行,在window析構(gòu)之后,quit也會(huì)被析構(gòu),因?yàn)閝uit也二次調(diào)用quit的析構(gòu)函數(shù)了,C++不允許調(diào)用兩次析構(gòu)函數(shù),因此,程序由此我們看到,Qt造的時(shí)候就指定parent對(duì)象,并且大膽在堆上創(chuàng)建。Qt(0,0,X對(duì)于嵌套窗口,其坐標(biāo)是相對(duì)于父窗口來(lái)說(shuō)信號(hào)和槽機(jī)某個(gè)事件發(fā)生之后,比如,按鈕檢測(cè)到自己被點(diǎn)擊了一下,它就會(huì)發(fā)出一個(gè)信(signal(slot)的槽函數(shù)會(huì)自動(dòng)被回調(diào)。這就類(lèi)似觀(guān)察者模式:當(dāng)發(fā)生了感的事件,某一個(gè)Qt中,這樣的功能如何實(shí)現(xiàn)呢?QPushButton*quitBtn=newQPushButton("關(guān)閉窗口",this);QPushButton*quitBtn=newQPushButton("關(guān)閉窗口",this);connect()sender:signal:receiver:slot:接收對(duì)象在接收到信號(hào)之后所需要調(diào)用的函數(shù)(槽函數(shù)文檔中比如我們上面的按鈕的點(diǎn)擊信號(hào),在幫助文檔中輸入QPushButton,首先父類(lèi)QButtonsignals 信號(hào) 信號(hào)餓了hungryvoidvoid 請(qǐng)客treatpublicslots:voidvoid{emitteacher-}void{}teacher=newTeacher(this);student=newhungryvoidhungury(QStringname);voidtreat(QStringname 針來(lái)指向函數(shù)地址,然后在做連接void(Teacher::*teacherSingal)(QString)=void(Student::*studentSlot)(QString)=&Student::treat;發(fā)送者和接收者都需要是QObject的子(當(dāng)槽函數(shù)是全局函表達(dá)式等無(wú)需接收者的時(shí)候除外信號(hào)和槽函數(shù)返回值是信號(hào)只需要,不需要實(shí)槽函數(shù)需要也需要實(shí)槽函數(shù)是普通的成員函數(shù),作為成員函數(shù),會(huì)受到public、private、protected的影響;使用emit恰當(dāng)?shù)奈恢冒l(fā)送信號(hào)使用connect()函數(shù)連接信號(hào)和槽任何成員函數(shù)、static函數(shù)、全局函數(shù)和Lambda表達(dá)式都可以作為槽函信號(hào)槽要求信號(hào)和槽的參數(shù)一致,所謂一致,是參數(shù)類(lèi)型一致即便如此,槽函數(shù)存在的那些參數(shù)的順序也必須和信號(hào)的前面幾個(gè)一致起(也就是槽函數(shù)的參數(shù)比信號(hào)的少。如果是這種情況,這些槽會(huì)一個(gè)接一個(gè)的被調(diào)用,但是它們的調(diào)用順只要任意一個(gè)信號(hào)發(fā)出,這個(gè)槽就會(huì)被調(diào)用當(dāng)?shù)谝粋€(gè)信號(hào)發(fā)出時(shí),第二個(gè)信號(hào)被發(fā)出。除此之外,這種信號(hào)-信號(hào)的形式和信號(hào)-槽的形式?jīng)]有什么區(qū)別。槽可以被取消利用disconnect關(guān)鍵字是可以斷開(kāi)信號(hào)槽LambdaQt5Qt5Lambda在連接信號(hào)和槽的時(shí)候,槽函數(shù)可以使用Lambda表達(dá)式的方式進(jìn)行處理。LambdaQt4SIGNAL和SLOT這兩個(gè)宏,將兩個(gè)函數(shù)名轉(zhuǎn)換成了字符串connect()函數(shù)的signal和slot都是接受字符串,一旦出現(xiàn)連接不成功的情況Qt4是沒(méi)有編譯錯(cuò)誤(因?yàn)橐磺卸际亲址幾g期是查字符串是否匹配,而是在運(yùn)行時(shí)給出錯(cuò)誤。這無(wú)疑會(huì)增加程序的不穩(wěn)定性。Qt5Qt4,LambdaC++11中的Lambda表達(dá)式用于定義并創(chuàng)建的函數(shù)對(duì)象,以簡(jiǎn)化編程工作。Lambda[capture](parameters)[capture](parameters)mutable->return-{}[函數(shù)對(duì)象參數(shù)](操作符重載函數(shù)參數(shù))mutableLambda開(kāi)始,這部分必須存在,不能省略。函數(shù)對(duì)象參數(shù)thisLambda(包括Lambda所在類(lèi)的this,并且是值傳遞方式(相當(dāng)于編譯器自動(dòng)為我&。函數(shù)體內(nèi)可以使用Lambda所在作用范圍內(nèi)所有可見(jiàn)的局部變量(包Lambdathis,并且是傳遞方式(相當(dāng)于編譯器自動(dòng)為我們按傳遞了所有局部變量。thisLambdaa。將a按值進(jìn)行傳遞。按值進(jìn)行傳遞時(shí),函數(shù)體內(nèi)不能修改傳遞進(jìn)來(lái)的a的拷貝,因?yàn)槟J(rèn)情況下函數(shù)是const的。要修改傳遞進(jìn)來(lái)的a的拷貝mutable&a。將a按進(jìn)行傳遞a,&b。將a按值進(jìn)行傳遞,b按進(jìn)行傳遞 =,&a,&b。除a和b按進(jìn)行傳遞外,其他參數(shù)都按值進(jìn)行傳遞&,a,b。除a和b按值進(jìn)行傳遞外,其他參數(shù)都按進(jìn)行傳遞按值(如:(a,b))和按(如:(&a,&b))兩種方式進(jìn)行傳遞。QPushButton*myBtn=newQPushButton(this);QPushButton*myBtn2=newQPushButtonQPushButton*myBtn=newQPushButton(this);QPushButton*myBtn2=newQPushButton(this);intm=connect(myBtn,&QPushButton::clicked,this,[m]()mutable{m=100+10;qDebug()<<m;});connect(myBtn2,&QPushButton::clicked,this,[=]() {qDebug()<<m;});qDebug()qDebug()<<->返回值類(lèi)型,標(biāo)識(shí)函數(shù)返回值的類(lèi)型,當(dāng)返回值為void,或者函數(shù)體中只return(此時(shí)編譯器可以自動(dòng)推斷出返回值類(lèi)型)時(shí),這部QMainWindow是一個(gè)為用戶(hù)提供主窗口程序的類(lèi),包含一個(gè)菜單欄( bar多個(gè)(toolbars)多個(gè)錨接部件(dockwidgets)一個(gè)狀態(tài)欄(statusbar)及一個(gè)中心部件(centralwidget),是許多應(yīng)用程序的基礎(chǔ),如文本編輯器,圖 Bar Bar()創(chuàng)建菜單欄,通過(guò)QMainWindow類(lèi)的 Bar Bar()創(chuàng)建菜單,調(diào)用Q的成員函數(shù)add來(lái)添加菜QAction*QAction**) * (constQString& * (constQIcon&icon,constQString&創(chuàng)建菜單項(xiàng),調(diào)用Q的成員函數(shù)addAction來(lái)添加菜單QAction*addAction(constQString&QAction*addAction(constQIcon&icon,constQString&text)QAction*addAction(constQString&text,constQObject*receiver,constchar*member,constQKeySequence&shortcut=0)QAction*addAction(constQIcon&icon,constQString&text,constQObject*receiver,constchar*member,constQKeySequence&shortcut=當(dāng)我們把QAction對(duì)象添加到菜單,就顯示成一個(gè)菜單項(xiàng),添加到,就顯示成一個(gè)工具按鈕。用戶(hù)可以通過(guò)點(diǎn)擊菜單項(xiàng)、點(diǎn)擊按鈕、點(diǎn)擊主窗口的上可以有多個(gè)工具條通常采用一個(gè)菜單對(duì)應(yīng)一個(gè)工具條的的方QMainWindowaddToolBar()函數(shù)獲取主窗口的工具條對(duì)象,QToolBaraddActionQToolBarallowAreas 使用setAllowedAreas()函數(shù)指定??繀^(qū)域:setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea)使用setMoveable()函數(shù)設(shè)定的可移動(dòng)性:setMoveable(false)//QStatusBar////voidaddWidget(QWidget*widget,intstretch=//intinsertWidget(intindex,QWidget*widget,intstretch=//voidremoveWidget(QWidget*QDockWidget*QDockWidget*docknewQDockWidget("標(biāo)題 ||部件(中心部件Qt資源系統(tǒng)是一個(gè)跨平臺(tái)的資源機(jī)制,用于將程序運(yùn)行時(shí)所需要的資源以二進(jìn)制的形式于可執(zhí)行文件內(nèi)部。如果你的程序需要加載特定的資源(圖標(biāo)、文也就是說(shuō),如果你將資源以資源文件形式,它是會(huì)編譯到可執(zhí)行文件內(nèi)部。使用QtCreator可以很方便地創(chuàng)建資源文件。我們可以在工程上點(diǎn)右鍵,選擇Qt分類(lèi)下找到“QtQt右側(cè)的編輯區(qū)有個(gè)“添加,我們首先需要添加前綴,比如前綴取名images么就可以使用:/images/-open.png找到這個(gè)文件。這么做帶來(lái)一個(gè)問(wèn)題是,如果我們要更改件名,比如將別名來(lái)這個(gè)文件。具體做法是,選中這個(gè)文件,添加別名信息:這樣,我們可以直接使用:/images/doc-open到這個(gè)資源,無(wú)需關(guān)心的如果我們使用文本編輯器打開(kāi)res.qrc<filealias="doc--<filealias="doc- QtCreatorqrc文件。當(dāng)我qrc_res.cppQt我們的資源編譯成了C++代碼。6框。GUI功能組件都必須放在框中設(shè)置框通常會(huì)是一個(gè)頂層窗口,出現(xiàn)在程序。Qt中使用QDialog類(lèi)實(shí)現(xiàn)框。就像主窗口一樣,我們通常會(huì)設(shè)計(jì)一個(gè)類(lèi)承QDialog。QDialog(及其子類(lèi),以及所有Qt::Dialog類(lèi)型的類(lèi))的對(duì)于其parent指針都有額外的解釋如果parent為NULL則該框會(huì)作為一個(gè)頂層窗口否則則作為其父組件的子(此時(shí)其默認(rèn)出現(xiàn)的位置是parent的中心置,而非頂層窗口則會(huì)共享其父組件的位置。框分為模態(tài)框和非模態(tài)框模態(tài)框,就是會(huì)阻塞同一應(yīng)用程序中其它窗口的輸入文件,當(dāng)打開(kāi)文件框出現(xiàn)時(shí),我們是不能對(duì)除此框之外的窗口部分與此相反的是非模態(tài)框,例如查找框,我們可以在顯示著查找標(biāo)準(zhǔn)程序中幾乎相同,因此沒(méi)有必要在每一個(gè)程序中都自己實(shí)現(xiàn)這么一個(gè)框Qt的內(nèi)置; 模態(tài)框,用于顯示信息、詢(xún)問(wèn)問(wèn)題等 為提供紙張相關(guān)的選項(xiàng) 配置QPrintPreviewDialog Qt支持模態(tài)框和非模態(tài)框。使用QDialog::exec()實(shí)現(xiàn)應(yīng)用程序級(jí)別的模態(tài)使用QDialog::open()實(shí)現(xiàn)窗口級(jí)別的模態(tài)使用QDialog::show()實(shí)現(xiàn)非模態(tài)框Qt有兩種級(jí)別的模態(tài)框當(dāng)該種模態(tài)的框出現(xiàn)時(shí),用戶(hù)必須首先對(duì)框進(jìn)行交互,直到關(guān)閉框,然后才能程序中其他的窗口。該模態(tài)僅僅阻塞與框關(guān)聯(lián)的窗口,但是依然允許用戶(hù)與程序中其它窗互。窗口級(jí)別的模態(tài)尤其適用于多窗口模式。QDialog 在下面的示例中,我們調(diào)用了exec()將框顯示出來(lái),因此這就是一個(gè)模態(tài)QDialog 非模態(tài),下面我們?cè)囍鴮xec()修改為show(),看看非模態(tài)框,QDialogdialog(this);QDialogdialog(this);dialog.setWindowTitle(tr("o,dialog!"));程,框會(huì)顯示出來(lái),然后函數(shù)立即返回,代碼繼續(xù)執(zhí)行。注意,dialog是建立在棧上的,show()函數(shù)返回,MainWindow::open()函數(shù)結(jié)束,dialog超出作用域被析構(gòu),因此框了。知道了原因就好改了dialog改成QDialog*dialog=new o,dialog!"));如果你足夠細(xì)心,應(yīng)該發(fā)現(xiàn)上面的代碼是有問(wèn)題的:dialog存在內(nèi)存!dialognewdelete。解決方案也很簡(jiǎn)單:將MainWindow的指針賦給dialogQDialog*dialog=new o,dialog!"));,QDialog*dialog=new o,dialog!"));QWidgetparentQWidgetC++類(lèi)指針傳給Qt框。另外,如果對(duì)內(nèi)存占用有嚴(yán)格限制的話(huà),當(dāng)主窗口作為parent,QDialog*dialog=new o,dialog!"));setAttribute()函數(shù)設(shè)置框關(guān)閉時(shí),自動(dòng)銷(xiāo)毀框消息QMessageBoxstatic顯示關(guān)于框voidvoidabout(QWidget*parent,constQString&title,constQString&這是一個(gè)最簡(jiǎn)單的框,其標(biāo)題是title,內(nèi)容是text,父窗口是parent。框只有一個(gè)OK按鈕顯示關(guān)于Qt框。該框用于顯示有關(guān)Qt的信息voidvoidaboutQt(QWidget*parent,constQString&title=顯示嚴(yán)重錯(cuò)誤框StandardButtonStandardButtoncritical(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=Ok,這個(gè)框?qū)@示一個(gè)紅色的錯(cuò)誤符號(hào)。我們可以通過(guò)buttons參數(shù)指明其顯示的按鈕。默認(rèn)情況下只有一個(gè)Ok按鈕,我們可以使用StandardButtonsStandardButtoninformation(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttonsStandardButtoninformation(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=Ok,StandardButtonquestion(QWidget*parent,constQString&title,constQString&StandardButtonsbuttons=StandardButtons(Yes|StandardButtonquestion(QWidget*parent,constQString&title,constQString&StandardButtonsbuttons=StandardButtons(Yes|No),StandardButtondefaultButton=NoButton)StandardButtonwarning(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttonsStandardButtonwarning(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=Ok,QMessageBoxtr("Question"),tr("AreyouOK?"),{tr("I'mgladtohearthat!"));}{tr("I'msorry!"));}QMessageBox::question(這個(gè)框的父窗口是thisQMessageBox是QDialog的子類(lèi),這意味著它的初始顯示位置將會(huì)是在parent窗口的第二個(gè)參數(shù)是框的標(biāo)題第四個(gè)參數(shù)是關(guān)聯(lián)的按鍵類(lèi)型,我們可以使用或運(yùn)算符(|)指定框應(yīng)該出現(xiàn)的按鈕。比如我們希望是一個(gè)Yes和一個(gè)No。,QMessageBoxhasbeen,QMessageBoxhasbeen||intret=msgBox.exec();switch{caseqDebug()<<"Save caseQMessageBox::Discard:qDebug()<<"Discardchanges!";caseQMessageBox::Cancel:qDebug()<<"Close },msgBox是一個(gè)建立在棧上的QMessageBox實(shí)例。我們?cè)O(shè)置其主要文本信息為“Thehasbeenmodified.,informativeText則是會(huì)在框中顯detailedText,也就是詳細(xì)信息,當(dāng)我們點(diǎn)擊了詳細(xì)信息按鈕時(shí)框可以自動(dòng)顯示信息。我們自己定義的對(duì)exec()是其成為一個(gè)模態(tài)框,根據(jù)其返回值進(jìn)行相應(yīng)的操作。,標(biāo)準(zhǔn)文件,QFileDialog,也就是文件框。在本節(jié)中,嘗試編寫(xiě)一個(gè)簡(jiǎn)單的文本文件編輯器使用QFileDialog來(lái)打開(kāi)一個(gè)文本文件并將修改過(guò)的文件保存到硬盤(pán)。,Q*file我們?cè)诓藛魏吞砑恿藘蓚€(gè)動(dòng)作:打開(kāi)和保存。接下來(lái)是一個(gè)QTextEdit示、表格等等。不過(guò),我們現(xiàn)在只用它顯示純文本文件。QMainWindow有一setCentralWidget()函數(shù),可以將一個(gè)組件作為窗口的中心組件,放在窗口QTextEditconnect()QActionthis,&MainWindow::openFile);connect(saveAction,&QAction::triggered,this,openFile()saveFile()////void{QStringpath=QFileDialog::getOpenFileName(this,tr("OpenFile"),".",tr("TextFiles(*.txt)"));{QFile{tr("Cannotopen}QTextStreamin(&file);}{tr("Youdidnotselectany}}}void{QStringpath=QFileDialog::getSaveFileName(this,tr("OpenFile"),".",tr("TextFiles(*.txt)"));{QFile{tr("Cannotopen}}{tr("Youdidnotselectany}}QStringgetOpenFileName(QWidget*QStringgetOpenFileName(QWidget*parent=constQString&caption=QString(),constQString&dir=QString(),constQString&filter=QString(),QString*selectedFilter=0,Optionsoptions=0)parent:Qt的標(biāo)準(zhǔn)框提供靜態(tài)函數(shù),用于返回一個(gè)模態(tài)框caption:框標(biāo)題dir:框打開(kāi)時(shí)的默“/”代表當(dāng)前盤(pán)符的根(WindowsLinux是根,這個(gè)參數(shù)也可以是平臺(tái)相關(guān)的,比如“C:\\”等;filter:望打開(kāi)文件過(guò)濾器就是用于過(guò)濾特定的后綴名如果我們使“ImageFiles(*.jpg*.pngjpgpng如果需要多個(gè)過(guò)濾器使用,比如“JPEGFiles(*.jpg);;PNGFiles(*.png)selectedFilter:options:框的一些參數(shù)設(shè)比如只顯示文件夾等等,它的取值是enumQFileDialog::Option,每個(gè)選項(xiàng)可以使用|運(yùn)算組合起來(lái)。QFileDialog::getOpenFileName()返回值是選擇的文件路徑。其賦值給saveFile()QFileDialog::getSaveFileName(種靜態(tài)函數(shù)在WindowsMacOS上面都是接調(diào)用本地框但是LinuxQFileDialog接使用QFileDialog進(jìn)行設(shè)置那么得到的框很可能與系統(tǒng)框的外觀(guān)不一致。這一點(diǎn)是需要注意的。布局管理所謂GUI界面,歸根結(jié)底,就是一堆組件的疊加。我們創(chuàng)建一個(gè)窗口,把按鈕Qt提供了兩種組件定位機(jī)制:絕對(duì)定位和布局定位這樣,Qt就知道該把組件放在哪里以及如何設(shè)置組件的大小。但是這樣做然,因?yàn)槟悴](méi)有告訴Qt,在窗口變化時(shí),組件是否要更新自己以及如何QtQHBoxLayout:QVBoxLayout:QGridLayout:在一個(gè)網(wǎng)格中進(jìn)行布局,類(lèi)似于HTML的4widget可以搭建出如下登陸界面:常用控QtQLabelQLabel(普通文本、QLabelsetTextvoidvoidsetText(constQStringQLable*label=newQLable;QLable*label=newQLable;比如顯示一個(gè):QLabel*label=newlabel->setText(" o,World");label->setText("<h1><ahref=\"httlabel->setOpenExternalLinks(true); 一下其中setOpenExternalLinks()函數(shù)是用來(lái)設(shè)置用QLabel*label=newlabel->setText(" o,World");label->setText("<h1><ahref=\"httlabel->setOpenExternalLinks(true); 一下顯示QPixmapvoidsetPixmap(constQPixmapQLabelQPixmapvoidsetPixmap(constQPixmap最后將設(shè)置到QLabelQLabelQLabel*label=newQLabel;可以使用QLabel的成員函數(shù)setMovie加載動(dòng)畫(huà),可 gif格式的文voidvoidsetMovie(QMovie*QMoviedQMovieQMovie*movie=newmovie-movie-QLabelQLabelQLabel*label=newQLabel;Qttext(,QStringQStringtext()使用QLineEdit類(lèi)的setEchoMode()函數(shù)設(shè)置文本的顯示模式,函數(shù)EchoModeQLineEdit::NormalQLineEdit::NoEchoQLineEdit::Password模式,輸入的字符會(huì)根據(jù)平臺(tái)轉(zhuǎn)換為特殊字符QLineEdit::PasswordEchoOnEdit編輯時(shí)顯示字符否則顯示字符作為密voidsetTextMargins(intleft,inttop,voidsetTextMargins(intleft,inttop,intright,intQtQtQt做成一個(gè)獨(dú)立的窗口類(lèi),以備以后重復(fù)使用。在使用Qt的ui文件搭建界面的時(shí)候欄中只為我們提供了標(biāo)準(zhǔn)的窗口控QWidgetSmallWidget,////classSmallWidget:public{explicitSmallWidget(QWidget*parent=0);publicQSpinBox*spin;QSlider*slider;//{spin=newslider=newQSlider(Qt::Horizontal,//QHBoxLayout*layout=new//將控件添加到布局中////slider,&QSlider::setValue);spin,&QSpinBox::setValue);}那么這個(gè)SmallWidget打開(kāi)Qt的.ui文件,因?yàn)镾mallWidget是派Qwidget類(lèi),所以需要在uiQWidget彈出提升窗口部件添加之后,類(lèi)名會(huì)顯示到上邊的列表框中,然后單擊提升按鈕,完成操作.QWidgetwidget_3Qt消息機(jī)制和事事件(event)Qt面我們也曾經(jīng)簡(jiǎn)單提到,Qtmain()QApplication對(duì)象,然后調(diào)用它的exec()函數(shù)。這個(gè)函數(shù)就是開(kāi)始Qt的事件循環(huán)。在執(zhí)行exec()函數(shù)之后,程序?qū)⑦M(jìn)入事件循環(huán)來(lái)應(yīng)用程序的事件。當(dāng)事件發(fā)生時(shí),Qt將創(chuàng)建一個(gè)事件對(duì)象。Qt中所有事件類(lèi)都繼承于QEvent。在事件對(duì)象創(chuàng)建完畢后,QtQObjectevent()函數(shù)。event()函數(shù)并不直接處理事件,而是按照事件對(duì)象的類(lèi)型分派給特定的事件處理函數(shù)(eventhandlerQWidgetmouseReleaseEvent()classEventLabel:public{voidmouseMoveEvent(QMouseEvent*event);voidmousePressEvent(QMouseEvent*event);voidmouseReleaseEvent(QMouseEventclassEventLabel:public{voidmouseMoveEvent(QMouseEvent*event);voidmousePressEvent(QMouseEvent*event);voidmouseReleaseEvent(QMouseEvent*event);voidEventLabel::mouseMoveEvent(QMouseEvent{this->setText(QString("<center><h1>Move:(%1,}voidEventLabel::mousePressEvent(QMouseEvent{this->setText(QString("<center><h1>Press:(%1,}voidEventLabel::mouseReleaseEvent(QMouseEvent{QStringmsg.sprintf("<center><h1>Release:(%d,%d)</h1></center>",event->x(),event->y());this-}intmain(intargc,char{QApplicationa(argc,EventLabel*label=newlabel->setWindowTitle("MouseEventDemo");label->resize(300,200);label-return}EventLabel繼承了QLabel,覆蓋了mousePressEvent()、mouseMoveEvent()MouseReleaseEvent()三個(gè)函數(shù)。我們并沒(méi)有添加什么功能,只是在鼠標(biāo)(pressLabelQLabelHTML因此我們直接使用了HTML代碼來(lái)格式化文字。QString的arg()函數(shù)可以自動(dòng)替換掉QString中出現(xiàn)的占位符。其占位符以%開(kāi)始,后面是占位符的位置,例如%1,%2這種。QString("[%1, 語(yǔ)句將會(huì)使用x%1,y%2,QString[x,y]在mouseReleaseEvent()函數(shù)中我們使用了另外一種QString的構(gòu)造方法。我們使用類(lèi)似Csprintf()QString。labelmouseMoveEvent()這是因?yàn)镼Widget一個(gè)mouseTracking該屬性用于設(shè)置是否追蹤鼠標(biāo)。只有鼠標(biāo)被追蹤時(shí),mouseMoveEvent()才會(huì)發(fā)出。如果mouseTracking是,夠發(fā)出mouseMoveEvent()事件。如果mouseTracking為true,則main() label- 事件對(duì)象創(chuàng)建完畢后,Qt將這個(gè)事件對(duì)象傳遞給QObject的event()函數(shù)。發(fā)給不同的事件處理器(eventhandlerboolCustomWidget::event(QEvent{if(e->type()==QEvent::KeyPress)QKeyEvent*keyEvent=static_cast<QKeyEventevent()QWidget組件中tab鍵的按下那么就可以繼承QWidgetboolCustomWidget::event(QEvent{if(e->type()==QEvent::KeyPress)QKeyEvent*keyEvent=static_cast<QKeyEventifif(keyEvent->key()==Qt::Key_Tab){qDebug()<<"Youpresstab.";returntrue;}}return}CustomWidget是一個(gè)普通的QWidget子類(lèi)。我們重寫(xiě)了它的event()函數(shù),這個(gè)函數(shù)有一個(gè)QEvent對(duì)象作為參數(shù),也就是需要轉(zhuǎn)發(fā)的事件對(duì)象。函數(shù)返回值是bool類(lèi)型。如果傳入的事件已被識(shí)別并且處理,則需要返回true,否則返回false。如果返回值是true,那么Qt會(huì)認(rèn)為這個(gè)事件已經(jīng)處理完畢,不會(huì)再將這event()函數(shù)中,調(diào)用事件對(duì)象的acceptignore()函數(shù)是沒(méi)有作用的,不會(huì)影響到事件的。boolCustomTextEdit::event(QEvent{if(e->type()=={QKeyEvent*keyEvent=static_cast<QKeyEventboolCustomTextEdit::event(QEvent{if(e->type()=={QKeyEvent*keyEvent=static_cast<QKeyEvent*>(e);if(keyEvent->key()==Qt::Key_Tab){qDebug()<<"Youpresstab.";returntrue;}}return}Tab我們只處理的KeyPress類(lèi)型的事件,并且如果不是KeyPress事件,則直接返回//!!!boolQObject::event(QEvent{switch//!!!boolQObject::event(QEvent{switch(e->type()){caseQEvent::Timer:casecaseQEvent::ChildPolished:caseQEvent::ChildRemoved://...if(e->type()>=QEvent::User){}return}return}這是Qt5中QObject::event()函數(shù)的源代碼(Qt4的版本也是類(lèi)似的。我QtQEvent::type()判斷事件類(lèi)型,然后調(diào)用了特定的事件處理器。比如,如果event->type()返回值是QEvent::TimertimerEvent(QWidget::event()中一定會(huì)有如下的代碼:switch(event->type()) caseQEvent::MouseMove:caseQEvent::MouseMove://}事實(shí)也的確如此。timerEvent()和mouseMoveEvent()這樣的函數(shù),就是我們前eventhandler。也就是說(shuō),event()函數(shù)中實(shí)際是通過(guò)事件處理器來(lái)響應(yīng)一個(gè)具體的事這相當(dāng)于event()函數(shù)將具體事件的處理“委托”給具體的事件處理器。而這些事件處理protectedvirtual因此,我們重寫(xiě)了某一個(gè)事件處理器,即可讓Qt調(diào)用我們自己實(shí)現(xiàn)的版本。同的事件。鑒于重寫(xiě)event()函數(shù)需要十分注意父類(lèi)的同名函數(shù)的調(diào)用,一得是不是應(yīng)該調(diào)用父類(lèi)的同名處理器。這其實(shí)暗示了event()函數(shù)的另外一個(gè)作用:掉某些不需要的事件處理器。正如我們前面的CustomTextEdit例子看到的那樣,我們創(chuàng)建了一個(gè)只能響應(yīng)tab鍵的組件。這種作用是重寫(xiě)事件處想要按鍵事件,不讓別的組件接收到;或者要修改回車(chē)鍵的默認(rèn)處理。通過(guò)前面的章節(jié),我們已經(jīng)知道,Qt創(chuàng)建了QEvent事件對(duì)象之后,會(huì)調(diào)用QObjectevent()event()函數(shù)中實(shí)現(xiàn)的操作。由于event()函數(shù)是protected的,因此,需要繼承已有類(lèi)。event()event()函數(shù)還得一堆問(wèn)題好在Qt提供了另外一種機(jī)制來(lái)達(dá)到這一目的:事件過(guò)濾器。QObjecteventFilter()函數(shù),用于建立事件過(guò)濾器。函數(shù)原型如下:virtualboolQObject::eventFilterQObject*watched,QEvent*event感的類(lèi)型,就進(jìn)行我們自己的處理;如果不是,就繼續(xù)轉(zhuǎn)發(fā)。這個(gè)函數(shù)返回boolevent不想讓它繼續(xù)轉(zhuǎn)發(fā),就返回true,否則返回false。事件過(guò)濾器的調(diào)用時(shí)間是目標(biāo)對(duì)象(也就是參watched)接收到事件對(duì)象之前。也就是說(shuō),如果你在事件過(guò)濾器中停止了某個(gè)事件,那么,watchedclassMainWindow:publicclassMainWindow:public{booleventFilter(QObject*obj,QEvent*event);QTextEdit{textEdit=newQTextEdit;textEdit-}boolMainWindow::eventFilter(QObject*obj,QEvent{if(obj==textEdit)if(event->type()==QEvent::KeyPress)QKeyEvent*keyEvent=static_cast<QKeyEventqDebug()qDebug()<<"Atekeypress"<<keyEvent->key();returntrue;}elsereturn}}else//passtheeventontotheparentclassreturnQMainWindow::eventFilter(obj,event);}}MainWindow是我們定義的一個(gè)類(lèi)。我們重寫(xiě)了它的eventFilter()函數(shù)。為了過(guò)濾特定組件上的事件,首先需要判斷這個(gè)對(duì)象是不是我們感的組textEdit盤(pán)事件,則直接返回true,也就是過(guò)濾掉了這個(gè)事件,其他事件還是要繼 voidQObject::installEventFilter(QObject*filterObj QObjectQObject器(問(wèn)題在于,如果你沒(méi)有重寫(xiě)eventFilter()函數(shù),這個(gè)事件過(guò)濾器是沒(méi)我們可以向一個(gè)對(duì)象上面安裝多個(gè)事件處理器,只要調(diào)用多次event()函數(shù)處理了Tab boolCustomWidget::event(QEvent {{if(e->type()==QEvent::KeyPress)QKeyEvent*keyEvent=static_cast<QKeyEvent*>(e);if(keyEvent->key()==Qt::Key_Tab){qDebug()<<"Youpresstab.";returntrue;}}return}boolFilterObject::eventFilter(QObject*object,QEventboolFilterObject::eventFilter(QObject*object,QEvent{if(object==target&&event->type()=={QKeyEvent*keyEvent=static_cast<QKeyEvent*>(event);if(keyEvent->key()==Qt::Key_Tab){qDebug()<<"Youpresstab.";returntrue;}elsereturn}}return}installEventFilter()函數(shù)是QObject的函數(shù),QApplication或者QCoreApplicationQObjectQApplicationQCoreApplication這種全局的事件過(guò)濾器將會(huì)在所有其它特性對(duì)象的事件過(guò)濾器之前調(diào)用。盡管很強(qiáng)大,但這種行為會(huì)嚴(yán)重降低整個(gè)另外,如果在安裝過(guò)濾器之后,這兩個(gè)組件到了不同的線(xiàn)程,那么,只有等到二者重新回到同一線(xiàn)程的時(shí)候過(guò)濾器才會(huì)有效Qt的事件是整個(gè)Qt框架的機(jī)制之一,也比較復(fù)雜。說(shuō)它復(fù)雜,是因單總結(jié)一下Qt中的事件機(jī)制。QtLRESULTCALLBACKWndProc(HWNDUINTmessage, LRESULTCALLBACKWndProc(HWNDUINTmessage, LPARAM{case//...{case//...case//...}每一種事件對(duì)應(yīng)一個(gè)事件處理函數(shù)。Qt…QtQtevent()event()event()protectedevent(),函數(shù)?protected函數(shù)帶來(lái)的另外一個(gè)問(wèn)題是,如果我基于第庫(kù)進(jìn)行開(kāi)那些組件根本看不到這種事件。event()函數(shù)雖然可以,但其實(shí)也是接收到了QMouseEvent對(duì)象。我連讓它收都收不到。這樣做的好處是,模擬一這兩個(gè)問(wèn)題是event()函數(shù)無(wú)法處理的。于是,Qt提供了另外一種解決方案:過(guò)濾器可以安裝到任意QObject類(lèi)型上面,并且可以安裝多個(gè)。如果要實(shí)現(xiàn)全局的事件過(guò)濾器,則可以安裝到QApplication或者QCoreApplication上面。這里需要注意的是,如果使用installEventFilter()函數(shù)給一個(gè)對(duì)象安裝事件過(guò)濾過(guò)濾器的eventFilter()函數(shù)進(jìn)行過(guò)濾,其它對(duì)象不受影響。如果給QApplication對(duì)象安裝事件過(guò)濾器,那么該過(guò)濾器對(duì)程序中的每一個(gè)對(duì)象都有eventFilter()函數(shù)。事件過(guò)濾器可以解決剛剛我們event()函數(shù)的兩點(diǎn)不足首先,事件過(guò)濾器不是protected,因此我們可以向任何QObject類(lèi)其次事件過(guò)濾器在目標(biāo)對(duì)象接收到事件之前進(jìn)行處理如果事件過(guò)濾掉,目標(biāo)對(duì)象根本不會(huì)見(jiàn)到這個(gè)事件。事實(shí)上,還 法,我們沒(méi)有介紹。Qt事件的調(diào)用最終都會(huì)追溯QCoreApplication::notify()函數(shù),因此,最大的控制權(quán)實(shí)際上是重寫(xiě)QCoreApplication::notify()。這個(gè)函數(shù)的是virtualboolQCoreApplication::notify(QObject*virtualboolQCoreApplication::notify(QObject*QEvent*eventeventreceiver,receiver->event(eventreceivernotify()函數(shù)只有一個(gè),而事件過(guò)濾器要靈活得多?,F(xiàn)在我們可以總結(jié)一下Qt的事件處理,實(shí)際上是有五個(gè)層次paintEvent()、mousePressEvent()等事件處理函數(shù)。這是最普通、最重寫(xiě)event()函數(shù)event()函數(shù)是所有對(duì)象的事 QObjectQCoreApplication::instance(notify()disabled鼠標(biāo)事件。全局過(guò)濾器有一個(gè)問(wèn)題:只能用在主線(xiàn)程。重寫(xiě)QCoreApplication::notify()函數(shù)。這是最強(qiáng)大的,和全局事件過(guò)濾器用(QCoreApplication。繪圖和繪圖設(shè)QtAPIQPainter,QPainterDeviceQPaintEngineQPainter用來(lái)執(zhí)行繪制的操作;QPaintDevice是一個(gè) 的抽象,這個(gè)PaintedWidget::PaintedWidget(QWidget*parent):{resize(800,600);setWindowTitle(tr("PaintDemo"));}允許QPainter在其上面進(jìn)行繪制,也就是QPainter工作的空間;QPaintEngineQPainterQPaintDeviceQPaintEnginePaintedWidget::PaintedWidget(QWidget*parent):{resize(800,600);setWindowTitle(tr("PaintDemo"));}上面的示意圖告訴我們,Qt的繪圖系統(tǒng)實(shí)際上是QPainter在QPainterDevice上進(jìn)行繪制,它們之間使用QPaintEngine進(jìn)行通訊(也就是翻譯QPainter指令。QPainterclassPaintedWidget:publicclassPaintedWidget:public{PaintedWidget(QWidget*parent=0);voidpaintEvent(QPaintEvent}QWidgetpaintEvent()PaintedWidgetvoidPaintedWidget::paintEvent(QPaintEventvoidPaintedWidget::paintEvent(QPaintEvent{QPainterpainter(this);painter.drawLine(80,100,650,500);painter.drawRect(10,10,100,400);painter.setPen(QPen(Qt::green,5));painter.drawEllipse(50,150,400,200);}在構(gòu)造函數(shù)中,我們僅僅設(shè)置了窗口的大小和標(biāo)題。而paintEvent()函數(shù)則是QPainterpaintEvent()QPainter會(huì)某些細(xì)節(jié)問(wèn)題:由于我們每次重建QPainter,因此第一次運(yùn)行時(shí)所設(shè)置QPainter員變量。QPainter接收一個(gè)QPaintDevice指針作為參數(shù)。QPaintDevice有很多子類(lèi),比去繪制,而現(xiàn)在我們希望畫(huà)在這個(gè)組件,因此傳入的是this指針。QPainter有很多以draw開(kāi)頭的函數(shù),用于各種圖形的繪制,比如這里的drawLine()drawRect()drawEllipse()QPainterpen()painter.setPen(Qt::red)pen則下面繪制的矩形具有紅色的輪廓線(xiàn)。接下來(lái),pen修改為綠色,5像素寬(painter.setPen(QPen(Qt::green,5)),又設(shè)置了畫(huà)刷為藍(lán)色。這時(shí)候再調(diào)用draw函數(shù),則是具有綠色5像素寬輪廓線(xiàn)、藍(lán)色填充的橢圓。繪圖設(shè)備是指繼承QPainterDevice的子類(lèi)。Qt一共提供了四個(gè)這樣的類(lèi),分QPixmap、QBitmap、QImageQPictureQPixmapQBitmapQPixmap1,QPixmapisQBitmap()QPixmapQBitmapQImage專(zhuān)門(mén)為圖像的像素級(jí)做了優(yōu)化QPictureQPainterQPixmap、QBitmap、QPixmapQPaintDevice,QPainterQPixmappngjpegQPixmapQPainterdrawPixmap()QLabel、QPushButtonQPixmap設(shè)備關(guān)注意這里說(shuō)的顯示設(shè)備不是硬件而是操作系統(tǒng)提供的原QPixmapQBitmap繼承自QPixmap因此具有QPixmap的所有特性提供單像QBitmap時(shí)我們就說(shuō)色深是3.因此,所謂色深為1,也就是使用1個(gè)二進(jìn)制位表示顏色。1個(gè)位只有兩種狀態(tài):0和1,因此它所表示的顏色就有兩種,黑和白。所以說(shuō),QBitmap際上是只有黑白兩色的圖像數(shù)據(jù)。由于QBitmap色深小,因此只占用很少的空間,所以適合做光標(biāo)文件和筆QPixmapQBitmapvoidPaintWidget::paintEvent(QPaintEventvoidPaintWidget::paintEvent(QPaintEvent{QPixmappixmap(":/Image/butterfly.png");QPixmappixmap1(":/Image/butterfly1.png");QBitmapbitmap(":/Image/butterfly.png");QBitmapQBitmapbitmap(":/Image/butterfly.png");QBitmapbitmap1(":/Image/butterfly1.png");QPainterpainter(this);painter.drawPixmap(0,0,pixmap);painter.drawPixmap(200,0,painter.drawPixmap(0,130,painter.drawPixmap(200,130,}這里我們給出了兩張png。butterfly1.png是沒(méi)有透明色的純白背景,而butterfly.png是具有透明色的背景。我們分別使用QPixmap和QBitmap來(lái)加載它們注意看它們的區(qū)別白色的背景在QBitmap中了而透明色在QBitmapQPixmap使用底層平臺(tái)的繪制系統(tǒng)進(jìn)行繪制,無(wú)法提供像素級(jí)別的操作,而QImage是使用獨(dú)立于硬件的繪制系統(tǒng),實(shí)際上是自己繪制自己,因此提供了我們了一個(gè)QImage對(duì)象,大小是300x300,顏色模式是RGB32,即使用32位數(shù)值表示一個(gè)顏色的RGB值,也就是說(shuō)每種顏色使用8位。然后我們對(duì)每個(gè)像素進(jìn)行顏色賦值從而構(gòu)成了這個(gè)圖像我們可以把QImage想象成一個(gè)RGBvoidPaintWidget::paintEvent(QPaintEvent {{QPainterQImageimage(300,300,QRgbfor(inti=50;i<100;{for(intj=50;j<100;{valueqRgb(255,0,0);image.setPixel(i,j,}}painter.drawImage(QPoint(0,0),}QImageQPixmap像I/O、 平臺(tái)上可能會(huì)有不同的顯示效果,QImage使用Qt自身的繪圖引擎,可在不由于QImage是獨(dú)立于硬件的,也是一種QPaintDevice,因此我們可以在另一個(gè)線(xiàn)程中對(duì)其進(jìn)行繪制,而不需要在GUI線(xiàn)程中處理,使用這一方式可以UIQImage可通過(guò)setPixpel()和pixel()等方法直接存取指定的像素。QImage與QPixmapQImageQPixmapfromImage(constQImage&Qt::ImageConversionFlagsflags=QPixmapQPixmap QImagetoImage() QPicture這是一個(gè)可以記錄和重現(xiàn)QPainter令的繪圖設(shè)備。QPicture將QPainter令序列化到一個(gè)IO設(shè)備,保存為一個(gè)平臺(tái)獨(dú)立的文件格式。這種格式有時(shí)候會(huì)是“元文件(metafiles)Qt式是二進(jìn)制的,不同于某些本地的元文件,Qtpicturespicture或者屏幕。回憶下我們這里所說(shuō)的QPaintDevice,實(shí)際上是說(shuō)可以有QPainter繪制的對(duì)象。QPicture使用系統(tǒng)的分辨率,并且可以調(diào)整QPainter如果我們要記錄下QPainter令,首先要使用QPainter::begin()函數(shù),將QPicture實(shí)例作為參數(shù)傳遞進(jìn)去,以便告訴系統(tǒng)開(kāi)始記錄,記錄完畢后使用voidPaintWidget::paintEvent(QPaintEventvoidPaintWidget::paintEvent(QPaintEvent{QPicturepic;QPainterpainter;painter.drawEllipse(20,20,100,50);painter.fillRect(20,100,100,100,Qt::red);painter.drawPicture(200,200,pic);}文件系文件操作是應(yīng)用程序必不可少的部分。Qt讀寫(xiě)字節(jié)塊的能力。下面是I/O設(shè)備的類(lèi)圖(Qt5:QIODeviceI/OQFileDevice:Qt5QFlie:本地文件或者嵌入資源QTemporaryFile:創(chuàng)建和本地文件系統(tǒng)的臨時(shí)文件QBuffer:QbyteArray,QProcess:QSocket:QTcpSocket:TCPQUdpSocket:傳輸U(kuò)DPQSslSocket:使用SSL/TLS順序設(shè)備是指它們的數(shù)據(jù)只能一遍:從頭走到尾,從第一個(gè)字節(jié)開(kāi)始,直到最后一個(gè)字節(jié),中途不能返回去上一個(gè)字節(jié),這其中,QProcess、QTcpSocket、QUdpSoctetQSslSocket是順序設(shè)備。隨機(jī)設(shè)備可以任意位置任意次數(shù),還可以使用QIODevice::seek()函數(shù)來(lái)重新定文件操作是應(yīng)用程序必不可少的部分。Qt作為一個(gè)通用開(kāi)發(fā)庫(kù),提供了跨平臺(tái)I/OI/O我們大多數(shù)的程序依舊需要首先本地文(當(dāng)然在云計(jì)算大行其道的將來(lái),這一觀(guān)點(diǎn)可能改變。QFile提供了從文件中和寫(xiě)入數(shù)據(jù)的能力。我們通常會(huì)將文件路徑作為參數(shù)傳給QFile造函數(shù)。不過(guò)也可以在創(chuàng)建好對(duì)象最后,使用setFileName()來(lái)修改。QFile需要使用/作為文件分隔符,不在Windows平臺(tái)下同樣是可以的。QFile主要提供了有關(guān)文件的比如打開(kāi)文件關(guān)閉文件刷新文件等。我們可以使用QDataStream或QTextStream類(lèi)來(lái)讀寫(xiě)文件,也可以使用QIODevice類(lèi)提供的read()、readLine()、readAll()以及write()這樣的函數(shù)。 是通過(guò)QFileInfo獲取,而不是自己分析文件路徑字符串。

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論