Qt程序設(shè)計(jì)基礎(chǔ)1_第1頁(yè)
Qt程序設(shè)計(jì)基礎(chǔ)1_第2頁(yè)
Qt程序設(shè)計(jì)基礎(chǔ)1_第3頁(yè)
Qt程序設(shè)計(jì)基礎(chǔ)1_第4頁(yè)
Qt程序設(shè)計(jì)基礎(chǔ)1_第5頁(yè)
已閱讀5頁(yè),還剩86頁(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)介

Qt程序開(kāi)發(fā)入門第一部分: Qt基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)2GUI所謂GUI(GraphicsUserInterface),就是圖形用戶界面。圖形用戶界面的廣泛流行是當(dāng)今計(jì)算機(jī)技術(shù)的重大成就之一,3*WIMP。其中,W(Windows)指窗口,是用戶或系統(tǒng)的一個(gè)工作區(qū)域。一個(gè)屏幕上可以有多個(gè)窗口。I(Icons)指圖圖標(biāo),是形象化的圖形標(biāo)志,易于人們隱喻和理解。M(Menu)指菜單,可供用戶選擇的功能提示。P(PointingDevices)指鼠標(biāo)等,便于用戶直接對(duì)屏幕對(duì)象進(jìn)行操作。*用戶模型。GUI采用了不少Desktop桌面辦公的隱喻,讓使用者共享一個(gè)直觀的界面框架。由于人們熟悉辦公桌的情況,因而對(duì)計(jì)算機(jī)顯示的圖標(biāo)的含義容易理解,諸如:文件夾、收件箱、畫(huà)筆、工作簿、鑰匙及時(shí)鐘等。*直接操作。過(guò)去的界面不僅需要記憶大量命令,而且需要指定操作對(duì)象的位置,如行號(hào)、空格數(shù)、X及Y的坐標(biāo)等。采用GUI后,用戶可直接對(duì)屏幕上的對(duì)象進(jìn)行操作,如拖動(dòng)、刪除、插入以及所得(WhatYouSeeIsWhatYouGet,WYSIWYG)。用視、點(diǎn)(鼠標(biāo))代替了放大和旋轉(zhuǎn)等。用戶執(zhí)行操作后,屏幕能立即給出反饋信息或結(jié)果,稱為所見(jiàn)即記、擊(鍵盤(pán)),給用戶帶來(lái)了方便4通常所見(jiàn)的GUI都是位于PC機(jī)上的,但是在PC上GUI并不適合嵌入式系統(tǒng)。嵌入式設(shè)備有嚴(yán)格的資源要求(比如十分有限的存儲(chǔ)空間)。同時(shí)嵌入式系統(tǒng)經(jīng)常有一些特殊的要求,而普通的PC上的圖形窗口系統(tǒng)是不能滿足這些要求的。5嵌入式GUI要求輕型,占用源少;高性能;高可靠性;可配置。6常用GUI介紹

1.MiniGUI由北京飛漫軟件技術(shù)有限公司開(kāi)發(fā)MiniGUI(),是國(guó)內(nèi)為數(shù)不多的幾大國(guó)際知名自由軟件之一。MiniGUI

是面向?qū)崟r(shí)嵌入式系統(tǒng)的輕量級(jí)圖形用戶界面支持系統(tǒng),1999年初遵循GPL條款發(fā)布第一個(gè)版本以來(lái),已廣泛應(yīng)用于手持信息終端、機(jī)頂盒、工業(yè)控制系統(tǒng)及工業(yè)儀表、彩票機(jī)、金融終端等產(chǎn)品和領(lǐng)域。目前,MiniGUI

已成為跨操作系統(tǒng)的圖形用戶界面支持系統(tǒng),可在Linux/uClinux、eCos、uC/OS-II、VxWorks等操作系統(tǒng)上運(yùn)行;已驗(yàn)證的硬件平臺(tái)包括Intelx86、ARM(ARM7/AMR9/StrongARM/xScale)、PowerPC、MIPS、M68K(DragonBall/ColdFire)等等。72.MicroWindows

MicroWindows(http://)是一個(gè)開(kāi)放源碼的項(xiàng)目,目前由美國(guó)CenturySoftware公司主持開(kāi)發(fā)。該項(xiàng)目的開(kāi)發(fā)一度非?;钴S,國(guó)內(nèi)也有人參與了其中的開(kāi)發(fā),并編寫(xiě)了GB2312等字符集的支持。但在Qt/Embedded發(fā)布以來(lái),該項(xiàng)目變得不太活躍,并長(zhǎng)時(shí)間停留在0.89Pre7版本??梢哉f(shuō),以開(kāi)放源碼形勢(shì)發(fā)展的MicroWindows項(xiàng)目,基本停滯。8

MicroWindows

是一個(gè)基于典型客戶/服務(wù)器體系結(jié)構(gòu)的GUI系統(tǒng),基本分為三層。最底層是面向圖形輸出和鍵盤(pán)、鼠標(biāo)或觸摸屏的驅(qū)動(dòng)程序;中間層提供底層硬件的抽象接口,并進(jìn)行窗口管理;最高層分別提供兼容于XWindow和WindowsCE(Win32子集)的API。95.Qt/EmbeddedQt/Embedded是著名的Qt庫(kù)開(kāi)放商正在進(jìn)行的面向嵌入式系統(tǒng)的Qt版本。這個(gè)版本的主要特點(diǎn)是可移植性較好,許多基于Qt的XWindow程序可以非常方便地移植到嵌入式版本。10Qt簡(jiǎn)介Qt是Trolltech公司的標(biāo)志性產(chǎn)品,是一個(gè)跨平臺(tái)的C++圖形用戶界面(GUI)工具包Qt應(yīng)用程序接口與工具兼容于所有支持平臺(tái),讓開(kāi)發(fā)員們掌握一個(gè)應(yīng)用程序接口,便可執(zhí)行與平臺(tái)非相關(guān)的應(yīng)用開(kāi)發(fā)與配置Qt/Windows

(WindowsXP,2000,NT4,Me/98)Qt/Mac

(MacOSX)Qt/X11

(Linux,Solaris,HP-UX,IRIX,AIX等)Qt對(duì)不同平臺(tái)的專門API進(jìn)行了 專門的封裝(文件處理,網(wǎng)絡(luò)等)

Trolltech公司由Haavard

Nord(執(zhí)行總裁)和Eirik

Chambe-Eng(總裁)于1994年在挪威創(chuàng)立的,2008年6月被NOKIA收購(gòu)。通過(guò)直銷,轉(zhuǎn)售和戰(zhàn)略合作伙伴等多種方式聯(lián)合銷售產(chǎn)品。Trolltech是一家擁有兩個(gè)主線產(chǎn)品(Qt和Qtopia)的軟件公司。

Trolltech采取了成功的雙重授權(quán)戰(zhàn)略,為開(kāi)發(fā)者提供商業(yè)和免費(fèi)軟件的授權(quán)使用。

擁有遍布全球60個(gè)國(guó)家的4400個(gè)客戶,其中包括Adobe,IBM,Sharp,Siemens及其他全球知名公司。

11Trolltech的雙重授權(quán)模式Trolltech公司提供兩種授權(quán)模式,一種用于商業(yè)性質(zhì)的授權(quán),一種用于免費(fèi)的開(kāi)源授權(quán)12QT的歷史1996Sep24Qt1.01996OctKDE組織成立1998Apr05Trolltech的程序員在5天之內(nèi)將Netscape5.0從Motif移植到Qt上1998Apr08KDEFreeQt基金會(huì)成立1998Jul12KDE1.0發(fā)布1999Jun25Qt2.0發(fā)布2000Mar20嵌入式Qt發(fā)布2000Sep06Qt2.2發(fā)布2000Sep04Qtfreeedition開(kāi)始使用GPL2004Aug4.02008Aug4.4發(fā)布,集成Webkit和Phonon13QT產(chǎn)品產(chǎn)品包括Qt、基于Framebuffer的QtEmbedded、快速開(kāi)發(fā)工具QtDesigner、國(guó)際化工具QtLinguist等部分。Qt/Embedded是面向嵌入式系統(tǒng)的Qt版本,是Qt的嵌入式Linux窗口,是完整的自包含C++GUI(圖形用戶界面)和基于Linux的嵌入式平臺(tái)開(kāi)發(fā)工具。Qt/EmbeddedAPI可以用于多種開(kāi)發(fā)項(xiàng)目。許多基于Qt的XWindow程序可以非常方便地移植到嵌入式版本,適用于高端PDA等產(chǎn)品14QT產(chǎn)品

Qtopia是為了Linux的PDA、智能電話和其他移動(dòng)設(shè)備設(shè)計(jì)的一個(gè)全面并且可以用戶化的應(yīng)用程序平臺(tái)和用戶界面。它是第一個(gè)面向嵌入式Linux的全方位應(yīng)用程序開(kāi)發(fā)平臺(tái),它可以并且已經(jīng)應(yīng)用于眾多的基于Linux的PDA(個(gè)人數(shù)字助理)設(shè)備和智能電話。

15Qt特征(一)面向?qū)ο驫t具有模塊設(shè)計(jì)和注重軟件構(gòu)件或元素的可重用性的特點(diǎn),一個(gè)組件不需要知道它的內(nèi)容和用途,通過(guò)signal和slot與外界通信、交流。而且,所有Qt的組件都可通過(guò)繼承。構(gòu)件支持Qt提供信號(hào)(signal)和插槽(slot)概念,這是一種類型安全的方法,它允許回調(diào),并支持對(duì)象之間在彼此不知道對(duì)方信息的情況下進(jìn)行合作,這使得Qt非常適合于真正的構(gòu)件編程1617Qt特征(一)友好的聯(lián)機(jī)幫助Qt提供了大量的聯(lián)機(jī)參考文檔,有超文本HTML方式,也有Unix幫助頁(yè)man手冊(cè)頁(yè)和補(bǔ)充說(shuō)明。并且對(duì)于初學(xué)者,其中的指南將一步步介紹如何進(jìn)行Qt編程18Qt特征(二)便利性由于Qt是一種跨平臺(tái)的GUI工具包,它對(duì)編程者隱藏了在處理不同窗口系統(tǒng)時(shí)潛在的問(wèn)題,Qt定義了一些類來(lái)隱藏在不同操作系統(tǒng)上不同處理方式下的細(xì)節(jié)問(wèn)題用戶自定義使用其他的一些工具包經(jīng)常會(huì)遇到這樣一種情況,沒(méi)有真正適合需求的組件,聲稱自定義的組件對(duì)用戶來(lái)說(shuō)就像一個(gè)黑匣子。而在Qt中生成用戶自定義的組件非常簡(jiǎn)單,而且易于修改組件的行為國(guó)際化Qt為本地化應(yīng)用提供完全的支持,所有用戶界面的文本或字符串都可以利用翻譯工具將其譯成各國(guó)語(yǔ)言。

Qt還支持雙字節(jié)16bit國(guó)際字符標(biāo)準(zhǔn)19Qt特征(三)豐富的API函數(shù)Qt為專業(yè)應(yīng)用提供了大量的函數(shù),在Qt的API中含有大約250個(gè)C++類,大多數(shù)的類都是GUI專有的可用戶化外觀Qt支持主題,基于Qt的應(yīng)用程序能夠在Windows外觀、Motif外觀,以及其它一些用戶化外觀主題之間切換完整的一套組件工具Qt編程的基本模塊稱之為組件,組件是用戶界面的組成部分,比如按鈕、滾動(dòng)條。Qt含有用來(lái)創(chuàng)建專業(yè)外觀的用戶界面所需要的所有組件。20主題21MotifMotif最初是由OSF(開(kāi)放基金協(xié)會(huì))開(kāi)發(fā)的一個(gè)工業(yè)標(biāo)準(zhǔn)的GUI(圖形用戶接口)。在開(kāi)放系統(tǒng)(如Linux)上,可以使用免費(fèi)的Motif。

Motif最先實(shí)現(xiàn)并運(yùn)行于支持X窗口系統(tǒng)上,它是UNIX系統(tǒng)的主要用戶接口。目前已經(jīng)應(yīng)用于超過(guò)200種硬件和軟件平臺(tái)。MotifGUIToolkit推動(dòng)了異種機(jī)和網(wǎng)絡(luò)環(huán)境下的應(yīng)用開(kāi)發(fā),各種機(jī)器包括便攜機(jī)、PC、工作站、超級(jí)計(jì)算機(jī)都得益于Motif環(huán)境下的應(yīng)用程序一致的行為和視感。用MotifGUI開(kāi)發(fā)的應(yīng)用軟件具有高度的可移植性、可交互性、以及可伸縮性。

22高性能的工具

對(duì)于庫(kù)來(lái)講,它的有效性遠(yuǎn)超過(guò)應(yīng)用性。為了提高Qt庫(kù)的有效性、快捷性,對(duì)其進(jìn)行了優(yōu)化,Qt能執(zhí)行一些基本的任務(wù),比如圖形的潤(rùn)色,比一般的基于平臺(tái)的代碼要快。Qt是基于Xlib,而不依賴Motif工具包。優(yōu)越的繪畫(huà)功能

Qt的繪畫(huà)工具QPainter類,在任意一個(gè)繪圖設(shè)備上都可以潤(rùn)色圖形。繪圖設(shè)備包括組件、像素映射、圖形文件和打印機(jī),相同的代碼可以用在4種不同類型的設(shè)備上。QPainter類支持復(fù)雜的同等系統(tǒng)的轉(zhuǎn)換,很容易在所有平臺(tái)上畫(huà)旋轉(zhuǎn)文本和像素映射。Xwindows的底層庫(kù)23QPainter繪制的圖形:24繪制2D/3D圖形功能Qt提供了QGLWidget類,使用該類能夠繪制2D/3D圖形。用QGLWidget就像用一個(gè)Qt組件一樣方便。25Qt系統(tǒng)構(gòu)造庫(kù)描述QtCore核心非GUI功能QtGui核心GUI功能QtNetwork網(wǎng)絡(luò)模塊QtOpenGLOpenGL模塊(為三維繪圖提供的標(biāo)準(zhǔn)應(yīng)用編程接口)QtSqlSQL模塊QtSvgSVG透視圖類QtXmlXML模塊Qt3Support支持Qt3的類QAxContainerActiveQt

客戶端的擴(kuò)充QAxServerActiveQt

服務(wù)器段的擴(kuò)充QtAssistantQt助手的語(yǔ)言類QtDesignerQt設(shè)計(jì)器的擴(kuò)展類QtUiTools生成動(dòng)態(tài)GUI類QtTest單元測(cè)試工具類2627Qt編程特點(diǎn)初始化在Qt應(yīng)用程序中,首先要?jiǎng)?chuàng)建一個(gè)QApplication對(duì)象,QApplication類負(fù)責(zé)圖形用戶界面應(yīng)用程序的控制流和主設(shè)置,在main.cpp中定義如下:

int

main(int

argc,char**argv){

QApplication

a(argc,argv); …… }

281.初始化QApplication包含在main()函數(shù)的事件循環(huán)體中,對(duì)所有來(lái)自Window系統(tǒng)和其它源文件的事件進(jìn)行處理和調(diào)度,還包括處理應(yīng)用程序的初始化和結(jié)束,并且提供會(huì)話管理。在Qt應(yīng)用程序中,不管有多少個(gè)窗口,QApplication對(duì)象只能有一個(gè),而且必須在其他對(duì)象之前創(chuàng)建。QApplication類中封裝了很多函數(shù),其中包括:系統(tǒng)設(shè)置:setFont()用來(lái)設(shè)置字體事件處理:sendEvent()用來(lái)發(fā)送事件

GUI風(fēng)格:setStyles()設(shè)置圖形用戶界面的風(fēng)格

顏色使用:colorSpec()用來(lái)返回顏色文件

文本處理:translate()用來(lái)處理文本信息

創(chuàng)建組件:setmainWidget()用來(lái)設(shè)置窗口的主組件

……292.窗口的創(chuàng)建 在Qt程序中,創(chuàng)建窗口比較簡(jiǎn)單,只要在main.cpp文件中為ApplicationWindow建立一個(gè)指針:ApplicationWindow*mw=newApplicatonWindow();ApplicationWindow是在Application.h中定義的類,它是一個(gè)QmainWindow的繼承類組件的創(chuàng)建需要調(diào)用相應(yīng)組件的類,并在頭文件中包含此類的頭文件或者創(chuàng)建自定義類,繼承以后組件類的功能#include“qpushbutton.h”3.組件的創(chuàng)建303.組件的創(chuàng)建

classhello::public

Qwidget {

…… }

hello類繼承了Qwidget類的特征,并加入了自定義的特征功能,同樣需要在頭文件中包含此類的頭文件 在main.cpp的函數(shù)中需要?jiǎng)?chuàng)建hello類的實(shí)例,或創(chuàng)建QPushButton類的實(shí)例,才可以使用

helloh(string);

QPushButtonhello(“Hello,world!”,0);

如果組件本身可以作為主窗口,則無(wú)需設(shè)置主窗口。在上例中,下壓按鈕創(chuàng)建時(shí)其構(gòu)造函數(shù)中的第二個(gè)參數(shù)為0,表示按鈕所在窗口為主窗口,不需要設(shè)置主窗口。否則需要調(diào)用QWidget成員函數(shù)setMainWidget()來(lái)進(jìn)行設(shè)置31窗體(Qwidget)Qt擁有豐富的滿足不同需求的窗體(按鈕,滾動(dòng)條等等),Qt的窗體使用起來(lái)很靈活,為了滿足特別的要求,它很容易就可以被子類化。窗體是Qwidget類或它子類的實(shí)例,客戶自己的窗體類需要從Qwidget它的子類繼承。323.組件的創(chuàng)建

h.setMainWidget(&h);//將m設(shè)為當(dāng)前窗口

組件創(chuàng)建時(shí)一般是不可見(jiàn)的,這樣的好處在于避免大量組件創(chuàng)建時(shí)造成的屏幕閃爍現(xiàn)象,要使組件可見(jiàn)需要調(diào)用QWidget類的成員函數(shù)show()來(lái)顯示組件

h.show();

在X程序中,敲擊鍵盤(pán),鼠標(biāo)指針在窗口中的移動(dòng)或鼠標(biāo)按鍵動(dòng)作等,都是事件

在Xt中提供了提供了一種叫做回調(diào)的事件處理方式。它通過(guò)翻譯表,將事件映射為相應(yīng)的動(dòng)作,當(dāng)組件得到事件通知,就去表中找出相應(yīng)的動(dòng)作例程進(jìn)行處理。這種機(jī)制需要應(yīng)用程序注冊(cè)有關(guān)組件的回調(diào)函數(shù)或普通的事件處理函數(shù),以分發(fā)循環(huán)Xt的事件4.事件33

Qt事件的處理過(guò)程:QApplication的事件循環(huán)體從事件隊(duì)列中拾取本地窗口系統(tǒng)事件或其他事件,譯成QEvent(),并送給QObject::event(),最后送給QWidget::event()本別對(duì)事件處理4.事件QApplicationQWidget::event()

QEventQObject::event()Y

等待事件讀取事件檢查事件類型處理事件退出事件處理循環(huán)事件處理循環(huán)部分N344.事件

其實(shí)在Qt程序中,事件處理的方式也是回調(diào),但與以往所不同的是,事件的發(fā)出和接收采用了信號(hào)(signal)和插槽(slot)機(jī)制,無(wú)須調(diào)用翻譯表。利用信號(hào)和插槽進(jìn)行對(duì)象間的通信是Qt的最主要特征之一 當(dāng)對(duì)象狀態(tài)發(fā)生改變的時(shí)候,發(fā)出signal通知所有的slot接收signal,盡管它并不知道哪些函數(shù)定義了slot,而slot也同樣不知道要接收怎樣的signal signal和slot機(jī)制真正實(shí)現(xiàn)了封裝的概念,slot除了接收signal之外和其它的成員函數(shù)沒(méi)有什么不同,而且signal和slot之間也不是一一對(duì)應(yīng)的。35Signal和Slot的聲明(一)

在Qt程序設(shè)計(jì)中,凡是包含signal和slot的類中都要加上Q_OBJECT的定義,下面的例子給出了如何在一個(gè)類中定義signal和slot:classStudent:publicQObject{Q_OBJECTpublic:Student(){myMark=0;}

intmark()const{returnmyMark;}publicslots:voidsetMark(int

newMark);signals:voidmarkChanged(int

newMark);private:

int

myMark;};36Signal和Slot的聲明(二)

signal的發(fā)出一般在事件的處理函數(shù)中,利用emit發(fā)出signal,在下面的例子中在在事件處理結(jié)束后發(fā)出signalvoidStudent::setMark(int

newMark){if(newMark!=myMark){

myMark=newMark;

emitmarkChanged(myMark);}}37Signal和Slot的連接(一) 在signal和slot聲明以后,需要使用connect()函數(shù)將它們連接起來(lái)。connect()函數(shù)屬于QObject類的成員函數(shù),它能夠連接signal和slot,也可以用來(lái)連接signal和signal函數(shù)原形如下:bool

connect(const

QObject

*

sender,const

char

*

signal, const

QObject

*

receiver,const

char

*

member)

其中第一個(gè)和第三個(gè)參數(shù)分別指出signal和slot是屬于那個(gè)對(duì)象或組件

將信號(hào)發(fā)送者sender對(duì)象中的信號(hào)signal與接受者receiver中的member槽函數(shù)聯(lián)系起來(lái)。

38Signal和Slot的連接(二) 在使用connect()函數(shù)進(jìn)行來(lái)接的時(shí)候,還需要用到SIGNAL()和SLOT()這兩個(gè)宏,使用方法如下:

QLabel*label=newQLabel;

QScrollBar*scroll=newQScrollBar;

QObject::connect(scroll,SIGNAL(valueChanged(int)), label,SLOT(setNum(int)));

39Signal和Slot的連接方式(一)40Signal和Slot的連接方式(二)同一個(gè)信號(hào)連接多個(gè)插槽connect(slider,SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));connect(slider,SIGNAL(valueChanged(int)),this,

SLOT(updateStatusBarIndicator(int)));多個(gè)信號(hào)連接到同一個(gè)插槽connect(lcd,SIGNAL(overflow()),this, SLOT(handleMathError()));connect(calculator,SIGNAL(divisionByZero()),this, SLOT(handleMathError()));41Signal和Slot的連接方式(三)一個(gè)信號(hào)連接到另一個(gè)信號(hào)connect(lineEdit,SIGNAL(textChanged(const

QString&)), this,SIGNAL(updateRecord(const

QString&)));取消一個(gè)連接disconnect(lcd,SIGNAL(overflow()),this,

SLOT(handleMathError()));取消一個(gè)連接不是很常用,因?yàn)镼t會(huì)在一個(gè)對(duì)象被刪除后自動(dòng)取消這個(gè)對(duì)象所包含的所有的連接42退出事件程序退出事件程序,只需要在程序結(jié)束時(shí)返回一個(gè)exec(),例如: returna.exec();其中a為QApplication的實(shí)例,當(dāng)調(diào)用exec()將進(jìn)入主事件的循環(huán)中,直到exit()被調(diào)用或主窗口部件被銷毀43整個(gè)Qt應(yīng)用程序的執(zhí)行過(guò)程初始化處理事件結(jié)束Qt應(yīng)用程序Qt庫(kù)請(qǐng)求隊(duì)列事件隊(duì)列Xserver設(shè)備相關(guān)層計(jì)算機(jī)鍵盤(pán)鼠標(biāo)屏幕44幾個(gè)例子45HELLOQT(1)

#include<QApplication>#include<QLabel>intmain(intargc,char*argv[]){

QApplicationapp(argc,argv);

QLabel*label=newQLabel("HelloQt!");

label->show();

returnapp.exec();}46HELLOQT(2):用HTML格式化

#include<QtGui>intmain(intargc,char*argv[]){

QApplicationapp(argc,argv);

QLabel*label=newQLabel("<h2><i>Hello</i>"

"<fontcolor=red>Qt!</font></h2>");

label->show();

returnapp.exec();}47創(chuàng)建鏈接

intmain(intargc,char*argv[]){

QApplicationapp(argc,argv);

QPushButton*button=newQPushButton("Quit");

QObject::connect(button,SIGNAL(clicked()),

&app,SLOT(quit()));

button->show();

returnapp.exec();}48基本布局(1)

intmain(intargc,char*argv[]){

QApplicationapp(argc,argv);

QSpinBox*spinBox=newQSpinBox;

QSlider*slider=newQSlider(Qt::Horizontal);

QObject::connect(spinBox,SIGNAL(valueChanged(int)),

slider,SLOT(setValue(int)));

QObject::connect(slider,SIGNAL(valueChanged(int)),

spinBox,SLOT(setValue(int)));49基本布局(2)

QHBoxLayout*layout=newQHBoxLayout;

layout->addWidget(spinBox);

layout->addWidget(slider);

QWidget*window=newQWidget;

window->setWindowTitle("EnterYourAge");

window->setLayout(layout);

window->show();

returnapp.exec();}

QHBoxLayout水平布局管理器

50

QHBoxLayout水平布局管理器

創(chuàng)建一個(gè)窗體并排擺放一個(gè)按鈕一個(gè)標(biāo)簽,使他們能夠隨著窗體的水平縮放而縮放實(shí)現(xiàn)這個(gè)功能需要使用布局管理器中的QHBoxlayout進(jìn)行布局,把這連個(gè)組件放入QHBoxlayout中。51QHBoxLayout水平布局管理器#include<QApplication>

#include<QLabel>

#include<QPushButton>

#include<QHBoxLayout>

#include<QWidget>

int

main(int

argc,char*argv[])

{

QApplicationapp(argc,argv);

QHBoxLayout*hlayout=newQHBoxLayout();

QPushButton*button=newQPushButton("imok");

QLabel*label=newQLabel("HelloQt!");

QWidget*window=newQWidget;

window->setWindowTitle("main");

hlayout->addWidget(button);

hlayout->addWidget(label);

window->setLayout(hlayout);

window->show();

returnapp.exec();

}52Qt提供了三種用于布局管理的類:QHBoxLayout,QVBoxLayout

和QgridLayout。QHBoxLayout,QVBoxLayout

和QGridLayout

的布局效果53一個(gè)完整的Qt程序1#include<qapplication.h>2#include<qlabel.h>3int

main(int

argc,char**argv)4{5QApplicationapp(argc,argv);6QLabel*hello=newQLabel("HelloQt/Embedded!",0);7app.setMainWidget(hello);8hello->show();9returnapp.exec();10}543個(gè)主要的基類QObject

QObject類是所有能夠處理signal、slot和事件的Qt對(duì)象的基類,原形如下:

QObject::QObject(QObject

*

parent=0,const

char

*

name=0)

創(chuàng)建帶有父對(duì)象及其名字的對(duì)象,對(duì)象的父對(duì)象可以看作為這個(gè)對(duì)象的所有者。比如,對(duì)話框是其中的ok和cancel按鈕的父對(duì)象。

在上面的函數(shù)中如果parent為0則構(gòu)造一個(gè)無(wú)父的對(duì)象,如果對(duì)象是一個(gè)組件,則它就會(huì)成為頂層的敞口。55QObject類(一)

class

Mandelbrot:public

QObject { Q_OBJECT//需要使用signal和slot

public :

Mandelbrot(QObect*parent=0,constchar*name); …… publicslots: voidstart(); signals: voiddone(); privateslots: voidcalculate(); private:

QTimertimer; …… };56QObject類(二)

//構(gòu)造初始化一個(gè)Mandelbrot對(duì)象

Mandelbrot::Mandelbrot(QObject*parent=0,constchar*name) :QObject(parent,name) {

connect(&timer,SIGNAL(timeout()),SLOT(calculate()));

……

{573個(gè)主要的基類2.QApplication

QApplication類負(fù)責(zé)GUI應(yīng)用程序的控制流和主要的設(shè)置,它包括主事件循環(huán)體,負(fù)責(zé)處理和調(diào)度所有來(lái)自窗口系統(tǒng)和其他資源的事件,并且處理應(yīng)用程序的開(kāi)始、結(jié)束以及會(huì)話管理,還包括系統(tǒng)和應(yīng)用程序方面的設(shè)置。對(duì)于一個(gè)應(yīng)用程序來(lái)說(shuō),建立此類的對(duì)象是必不可少的

QApplication和QWidget都是QObject類的子類58函數(shù)分組系統(tǒng)設(shè)置desktopSettingsAware()、setDesktopSettingsAware()、cursorFlashTime()、setCursorFlashTime()、doubleClickInterval()、setDoubleClickInterval()、wheelScrollLines()、setWheelScrollLines()、palette()、setPalette()、font()、setFont()、fontMetrics()。事件處理exec()、processEvents()、enter_loop()、exit_loop()、exit()、quit()。sendEvent()、postEvent()、sendPostedEvents()、removePostedEvents()、hasPendingEvents()、notify()、macEventFilter()、qwsEventFilter()、x11EventFilter()、x11ProcessEvent()、winEventFilter()。圖形用戶界面風(fēng)格

style()、setStyle()、polish()。顏色使用colorSpec()、setColorSpec()、qwsSetCustomColors()。文本處理setDefaultCodec()、installTranslator()、removeTranslator()、translate()。窗口部件mainWidget()、setMainWidget()、allWidgets()、topLevelWidgets()、desktop()、activePopupWidget()、activeModalWidget()、clipboard()、focusWidget()、winFocus()、activeWindow()、widgetAt()。高級(jí)光標(biāo)處理hasGlobalMouseTracking()、setGlobalMouseTracking()、overrideCursor()、setOverrideCursor()、restoreOverrideCursor()。X窗口系統(tǒng)同步flushX()、syncX()。對(duì)話管理isSessionRestored()、sessionId()、commitData()、saveState()。線程lock()、unlock()、locked()、tryLock()、wakeUpGuiThread()。雜項(xiàng)closeAllWindows()、startingUp()、closingDown()、type()。593個(gè)主要的基類3.

QWidget

QWidget類是所有用戶接口對(duì)象的基類,它繼承了QObject類的屬性。組件是用戶界面的單元組成部分,它接收鼠標(biāo)、鍵盤(pán)和其它從窗口系統(tǒng)來(lái)的事件,并把它自己繪制在盤(pán)屏幕上

QWidget類有很多成員函數(shù),但一般不直接使用,而是通過(guò)子類繼承來(lái)使用其函數(shù)功能。如,QPushButton、QlistBox等都是它的子類60窗體是Qwidget類或它子類的實(shí)例,客戶自己的窗體類需要從Qwidget它的子類繼承。61一個(gè)窗體可以包含任意數(shù)量的子窗體,子窗體可以顯示在父窗體的客戶區(qū),一個(gè)沒(méi)父窗體的窗體我們稱之為頂級(jí)窗體(一個(gè)“窗口”),一個(gè)窗體通常有一個(gè)邊框和標(biāo)題欄作為裝飾。Qt并未對(duì)一個(gè)窗體有什么限制,任何類型的窗體可以是頂級(jí)窗體,任何類型的窗體可以是別的窗體的子窗體。在父窗體顯示區(qū)域的子窗體的位置可以通過(guò)布局管理自動(dòng)的進(jìn)行設(shè)置,也可以人為的指定。當(dāng)父窗體無(wú)效,隱藏或被刪除后,它的子窗體都會(huì)進(jìn)行同樣的動(dòng)作。62上下文函數(shù)窗口函數(shù)show()、hide()、raise()、lower()、close()。頂級(jí)窗口caption()、setCaption()、icon()、setIcon()、iconText()、setIconText()、isActiveWindow()、setActiveWindow()、showMinimized()、showMaximized()、showFullScreen()、showNormal()。窗口內(nèi)容update()、repaint()、erase()、scroll()、updateMask()。幾何形狀pos()、size()、rect()、x()、y()、width()、height()、sizePolicy()、setSizePolicy()、sizeHint()、updateGeometry()、layout()、move()、resize()、setGeometry()、frameGeometry()、geometry()、childrenRect()、adjustSize()、mapFromGlobal()、mapFromParent()、mapToGlobal()、mapToParent()、maximumSize()、minimumSize()、sizeIncrement()、setMaximumSize()、setMinimumSize()、setSizeIncrement()、setBaseSize()、setFixedSize()。模式isVisible()、isVisibleTo()、visibleRect()、isMinimized()、isDesktop()、isEnabled()、isEnabledTo()、isModal()、isPopup()、isTopLevel()、setEnabled()、hasMouseTracking()、setMouseTracking()、isUpdatesEnabled()、setUpdatesEnabled()。觀感style()、setStyle()、cursor()、setCursor()、font()、setFont()、palette()、setPalette()、backgroundMode()、setBackgroundMode()、colorGroup()、fontMetrics()、fontInfo()。鍵盤(pán)焦點(diǎn)函數(shù)isFocusEnabled()、setFocusPolicy()、focusPolicy()、hasFocus()、setFocus()、clearFocus()、setTabOrder()、setFocusProxy()。鼠標(biāo)和鍵盤(pán)捕獲grabMouse()、releaseMouse()、grabKeyboard()、releaseKeyboard()、mouseGrabber()、keyboardGrabber()。事件處理器event()、mousePressEvent()、mouseReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent()、keyPressEvent()、keyReleaseEvent()、focusInEvent()、focusOutEvent()、wheelEvent()、enterEvent()、leaveEvent()、paintEvent()、moveEvent()、resizeEvent()、closeEvent()、dragEnterEvent()、dragMoveEvent()、dragLeaveEvent()、dropEvent()、childEvent()、showEvent()、hideEvent()、customEvent()。變化處理器enabledChange()、fontChange()、paletteChange()、styleChange()、windowActivationChange()。系統(tǒng)函數(shù)parentWidget()、topLevelWidget()、reparent()、polish()、winId()、find()、metric()。這是什么的幫助customWhatsThis()。內(nèi)部核心函數(shù)focusNextPrevChild()、wmapper()、clearWFlags()、getWFlags()、setWFlags()、testWFlags()。63主要的類描述抽象窗口部件類抽象窗口部件類是通過(guò)子類來(lái)使用的。高級(jí)窗口部件類高級(jí)的GUI窗口部件,比如列表視圖和進(jìn)度條基本窗口部件類基本的GUI窗口部件,比如按鈕、組合框和滾動(dòng)條數(shù)據(jù)庫(kù)類與數(shù)據(jù)庫(kù)相關(guān)的類,比如與SQL數(shù)據(jù)庫(kù)相關(guān)的類。日期與時(shí)間類處理日期與時(shí)間的類拖放類處理拖放和MIME類型的編碼和解碼類環(huán)境類提供了多樣全面的服務(wù),比如事件處理、系統(tǒng)設(shè)置訪問(wèn)和國(guó)際化等

服務(wù)的類事件類用來(lái)生成和處理事件的類非GUI類非GUI類是一個(gè)集合類。比如:列表、隊(duì)列、堆棧和字符串,它們

不需要QApplication類就可以和其他類一起使用。多媒體、圖形和打印類該類主要提供支持圖形(2D、3D和OpenGL),圖像的編碼、解碼和處理,聲音,動(dòng)畫(huà),打印等等。幫助系統(tǒng)類用來(lái)給應(yīng)用程序提供在線幫助的類。布局管理類用來(lái)處理自動(dòng)調(diào)整窗口部件的大小和位置,能夠構(gòu)成復(fù)雜對(duì)話框的類。共享類為了快速?gòu)?fù)制而使用引用計(jì)數(shù)的類。Qt系統(tǒng)的類Qt-

C++圖形用戶界面庫(kù)64Qt系統(tǒng)的類Qt-

C++圖形用戶界面庫(kù)主要的類描述輸入/輸出和網(wǎng)絡(luò)類提供文件輸入輸出,目錄和網(wǎng)絡(luò)操作。主窗口和相關(guān)類一切你所需要的典型現(xiàn)代主程序窗口,包括目錄、工具條、工作區(qū)等等。雜類各種各樣其他有用的類模塊/視圖類該類主要用于設(shè)計(jì)模塊/視圖平臺(tái)的類。對(duì)象模型Qt圖形用戶界面的工具包底層對(duì)象模型。組織者用戶接口組織者,比如:分隔器、TAB條、按鈕組等等。插件類插件相關(guān)類。標(biāo)準(zhǔn)對(duì)話框用于文件、字體、顏色選擇和更多的已經(jīng)做好的對(duì)話框。模板類Qt的模板庫(kù)容器類。文本相關(guān)類文本處理的類。(也可以參考XML類。)線程類提供線程支持的類。窗口外觀和風(fēng)格可以自定義風(fēng)格、字體、顏色等等外觀的類。XML類支持XML的類,例如:DOM和SAX。QtopiaCore類是QtopiaCore一個(gè)特殊的類(Qt的嵌入Linux)。65第二部分:QtDesigner66QtDesigner Qt應(yīng)用程序除了使用手工編寫(xiě)代碼的方式外,還可以用過(guò)QtDesinger來(lái)完成,QtDesigner的功能十分強(qiáng)大,界面類似于我們常用的VB,而且還提供了大量可供編程使用的組件6768基于QtDesigner程序設(shè)計(jì)(一) 在使用QtDesigner程序開(kāi)發(fā)時(shí),一般要涉及到下面幾個(gè)步驟: 1.創(chuàng)建和初始化子部件 2.設(shè)置子部件布局 3.設(shè)置Tab鍵次序(不是必須)

4.建立信號(hào)與插槽的連接

69基于QtDesigner程序設(shè)計(jì)(二)1.創(chuàng)建并布置部件2.對(duì)部件使用布局管理3.建立信號(hào)與插槽的連接70基于QtDesigner程序設(shè)計(jì)(三)編輯兩個(gè)部件之間信號(hào)與插槽之間的連接方式71基于QtDesigner程序設(shè)計(jì)(四) QtDesigner下不同風(fēng)格的預(yù)覽72QtDesigner的工作過(guò)程QtDesigner將工程文件組織成.ui的文件由.ui文件生成.cpp

和.h文件.ui-----xmluic生成moc_filenaem.cppmoc73QTui文件介紹1.生成方式:QT通過(guò)QTdesigner可以生成ui文件(.ui&&.ui.h)

2.UI文件內(nèi)容:以XML方式記錄了QTdesigner生成的界面的相關(guān)內(nèi)容,大體可以分為如下內(nèi)容widget屬性,其內(nèi)容(圖形元素,layout。。)的相關(guān)屬性頭文件

變量槽函數(shù)3.通過(guò)UIC(userinterfacecompiler)可以把UI文件內(nèi)容翻譯成標(biāo)準(zhǔn).h,.cpp文件

74QtDesigner功能框圖75子類繼承方式(Qt2.X)76第三部分:Qt開(kāi)發(fā)環(huán)境的建立77建立Qt/Embedded開(kāi)發(fā)環(huán)境(一) 在我們嵌入式開(kāi)發(fā)中Qt提供了使用在小型嵌入式設(shè)備上的輕量級(jí)的工具包Qt/Embedded(Qt/E),要使用Qt/E需要和Qt/X11以及tmake工具進(jìn)行配合,我們可以在Trolltech公司的ftp站點(diǎn)下載到這些工具包的源代碼ftp:///qt/source/

這里列出這些工具包的一個(gè)可用的組合Qt/Embedded2.3.10Qt2.3.2forX11tmake1.13

XWindow系統(tǒng)(X11或X)是一種位圖顯示的視窗系統(tǒng)。它是在Unix和類Unix操作系統(tǒng),以及OpenVMS上建立圖形用戶界面的標(biāo)準(zhǔn)工具包和協(xié)議

78建立Qt/Embedded開(kāi)發(fā)環(huán)境(二)解壓縮并設(shè)置環(huán)境變量安裝tmake

cd~/pxa270Qt tar–xzftmake-1.13.tar.gz exportTMAKEDIR=$PWD/tmake-1.13安裝Qt2.3.2cd~/pxa270Qttar–xzfqt-x11-2.3.2.tar.gzexportQT2DIR=$PWD/qt-2.3.2安裝Qt/E2.3.10cd~/pxa270Qttar–xzfqt-embedded-2.3.10-free.tar.gzexportQTEDIR=$PWD/qt-2.3.1079建立Qt/Embedded開(kāi)發(fā)環(huán)境(三) 編譯Qt/Embedded庫(kù)的時(shí)候需要注意,我們通常是要將庫(kù)源碼編譯兩次。一次是為了使我們的程序能夠在pc機(jī)上顯示出來(lái)而編譯的為pc機(jī)上的程序使用的Qt/E庫(kù);另一次是編譯在開(kāi)發(fā)板上使用的庫(kù),是為開(kāi)發(fā)板上的應(yīng)用程序準(zhǔn)備的庫(kù)文件

以編譯pc機(jī)上的Qt/E庫(kù)為例,編譯Qt/E的過(guò)程主要分為三步,分別是編譯Qt2.3.2,編譯qvfb,編譯Qt/Embedded2.3.1080建立Qt/Embedded開(kāi)發(fā)環(huán)境(四)編譯Qt2.3.2cd$QT2DIRexportTMAKEPATH=$TMAKEDIR/lib/linux-g++exportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure-no-xftmakemkdir$QTEDIR/binc

溫馨提示

  • 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)論