QT界面編程(1)_第1頁
QT界面編程(1)_第2頁
QT界面編程(1)_第3頁
QT界面編程(1)_第4頁
QT界面編程(1)_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、QT編程基礎(chǔ)1. QT簡介1.1. 簡介(1)Qt是Trolltech公司的標(biāo)志性產(chǎn)品,是一個(gè)跨平臺(tái)的C+圖形用戶界面(GUI)工具包。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級(jí)的圖形用戶界面所需的所有功能。Qt是完全面向?qū)ο蟮暮苋菀讛U(kuò)展,并且允許真正地組件編程。(2)Qt支持下述平臺(tái): MS/Windows - 95、98、NT 4.0、ME、2000 Unix/X11 - Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX和其它X11平臺(tái) Macintosh - Mac OS X Embedded - 有幀緩沖(framebuffer

2、)支持的Linux平臺(tái)。 (3)Trolltech公司采用雙重授權(quán)模式,一種用于商業(yè)性質(zhì)的授權(quán),一種用于免費(fèi)的開源授權(quán)。Qt企業(yè)版和Qt專業(yè)版提供給商業(yè)軟件開發(fā)。它們提供傳統(tǒng)商業(yè)軟件發(fā)行版并且提供免費(fèi)升級(jí)和技術(shù)支持服務(wù)。Qt自由版是Qt僅僅為了開發(fā)自由和開放源碼軟件提供的Unix/X11版本。在GPL協(xié)議下,它是免費(fèi)的。Qt/E自由版是Qt為了開發(fā)自由軟件提供的嵌入式版本。在GPL協(xié)議下,它是免費(fèi)的。1.2. 特點(diǎn)(1)可移植性:QT不僅適用于UNIX,同樣適用于Windows。為了同時(shí)擁有世界上幾百萬UNIX用戶以及幾百萬的Windows用戶,最好的辦法是采用一個(gè)既適用于UNIX,又適用于W

3、indows的GUI工具包,其答案是QT。(2)易用性:Qt為專業(yè)應(yīng)用提供了大量的函數(shù),在Qt的API中含有大約250個(gè)C+類,大多數(shù)的類都是GUI專有。而且QT是基于C+構(gòu)造,所以QT也具有面向?qū)ο缶幊痰乃袃?yōu)點(diǎn)。(3)構(gòu)件支持:Qt提供信號(hào)(signal)和插槽(slot)概念,這是一種類型安全的方法,它允許回調(diào),并支持對(duì)象之間在彼此不知道對(duì)方信息的情況下進(jìn)行合作,這使得Qt非常適合于真正的構(gòu)件編程。(4)國際化:Qt為本地化應(yīng)用提供了完全的支持,所有用戶界面文本都可以基于消息翻譯表被翻譯成各國語言,Qt還支持雙字節(jié)16bit國際字符標(biāo)準(zhǔn)。(5)運(yùn)行速度:QT非常容易使用,且也具有很快的速

4、度。QT的易用性和快速是密不可分的。這一優(yōu)點(diǎn)要?dú)w功于QT開發(fā)者的辛苦工作,他們花費(fèi)了大量的時(shí)間來優(yōu)化他們的產(chǎn)品。QT比其他許多GUI工具包運(yùn)行速度快的原因是其實(shí)現(xiàn)方式。QT是一個(gè)GUI仿真工具包,即它不使用本地工具包作調(diào)用,而是使用各自平臺(tái)上的低級(jí)繪圖函數(shù),從而提高程序速度。1.3. QT工程1.3.1. Qt工程編輯以下是編寫Qt工程文件(*.Pro)的變量說明:(1) TEMPLATE 變量TEMPLATE描述了為建立目標(biāo)文件而采用何種模板,即生成何種形式的Makefile文件。qmake工具定義了5種模板: 應(yīng)用程序App,為建立一個(gè)Qt應(yīng)用程序創(chuàng)建Makefile文件;

5、60;庫lib,為建立引用程序庫而創(chuàng)建Makefile文件; 子工程subdirs,為建立子目錄下的目標(biāo)文件創(chuàng)建一個(gè)Makefile文件,子目錄通過變量SUBDIRS指定(子目錄下的工程文件也需要指出使用何種模板); VC應(yīng)用程序vcapp,為Visual Studio 生成一個(gè)應(yīng)用程序工程。僅僅用語Windos操作系統(tǒng). VC庫vclib,為Visual Studio生成一個(gè)應(yīng)用程序庫工程,僅僅用語Windows操作系統(tǒng).(2)TARGET 描述了目標(biāo)文件的名稱, 也就是應(yīng)用程序的名字(或者說exe文件的名稱)。如果不設(shè)置, 與pro文件名稱相同。(3

6、)DEPENDPATH 描述了建立應(yīng)用程序所依賴的其他文件所在的路徑.(4)INCLUDEPATH 描述了編譯該工程時(shí)編譯器需要搜索的#include路徑.HAND(5)SOURCES 告訴編譯器, 源代碼文件路徑及其文件名字.(6)DESTDIR 定義了exe文件的路徑.(7)CONFIG 定義了編譯選項(xiàng) debug : 表示建立的目標(biāo)代碼是調(diào)試版本, 如果沒有則為Release版本. warn_on : 要求編譯器在編譯應(yīng)用程序時(shí)打開警告開關(guān).(8)OBJECTS_DIR 描述了存放中間文件(.o)文件的位置.

7、(9)VERSION描述軟件版本例如:PROJECT = QESPTATEMPLATE = app/ subdirs表示在工程在子文件中還包含工程SUBDIRS=src / 子工程文件的目錄由SUBDIRS指定DEPENDPATH += .INCLUDEPATH += ./.QMAKE_LIBDIR += ././buildOBJECTS_DIR = objMOC_DIR = mocUI_DIR = uicCONFIG += qt thread warn_onHEADERS += MainWindow.h MessageWindow.h QespTest.h Comma

8、ndWindow.h defs.hSOURCES += main.cpp MainWindow.cpp MessageWindow.cpp QespTest.cpp CommandWindow.cppTARGET =./bin/builtinCONFIG(debug, debug|release):LIBS += -lqextserialportdelse:LIBS += -lqextserialportunix:DEFINES = _TTY_POSIX_win32:DEFINES = _TTY_WIN_1.3.2. Qt工程編譯編譯一個(gè)C+應(yīng)用程序,你需要?jiǎng)?chuàng)建一個(gè)makefile。創(chuàng)建一個(gè)Q

9、t 的makefile 的最容易的方法是使用Qt 提供的連編工具qmake。如果你已經(jīng)把main.cpp 保存到它自己的目錄了,你所要做的就是這些:qmake -projectqmake第一個(gè)命令調(diào)用qmake 來生成一個(gè).pro(項(xiàng)目)文件。第二個(gè)命令根據(jù)這個(gè)項(xiàng)目文件來生成一個(gè)(系統(tǒng)相關(guān)的)makefile。你現(xiàn)在可以輸入make(或者nmake,如果你使用Visual Studio),然后運(yùn)行你的第一個(gè)Qt 應(yīng)用程序!1.4. 程序?qū)嵗?include <QtGui/QtGui>int main(int argc,char* argv) QApplication app(arg

10、c,argv); QTextCodec:setCodecForTr(QTextCodec:codecForLocale(); QWidget* w = new QWidget; QPushButton* pushButton = new QPushButton (tr(“退出”), w); w->show();QObject:connect(pushButton, SIGNAL( clicked(), w, SLOT( close() ); return app.exec();(1)初始化QApplication a(argc, argv);在Qt應(yīng)用程序中,首先要?jiǎng)?chuàng)建一個(gè)QApplic

11、ation對(duì)象,QApplication類負(fù)責(zé)圖形用戶界面應(yīng)用程序的控制流和主要設(shè)置。它包含在main()函數(shù)的事件循環(huán)體中,對(duì)所有來自Window系統(tǒng)和其它源文件的事件進(jìn)行處理和調(diào)度,還包括處理應(yīng)用程序的初始化和結(jié)束,并且提供會(huì)話管理。它還處理系統(tǒng)級(jí)和應(yīng)用程序級(jí)的設(shè)置。在Qt應(yīng)用程序中,不管有多少個(gè)窗口,QApplication對(duì)象只能有一個(gè),而且必須在其他對(duì)象之前創(chuàng)建。(2)國際化QTextCodec:setCodecForTr(QTextCodec:codecForLocale()setCodecForTr函數(shù)可以設(shè)置QObject:tr()的編碼方式,如果采用默認(rèn)值,則會(huì)是Latin-

12、1.假若程序中出現(xiàn)的字符不是Latin-1編碼方式,這個(gè)函數(shù)可以用來設(shè)置正確的編碼方式。而codecForLocale函數(shù)返回了本地區(qū)的編碼方式的codec指針。Qt使用Unicode(統(tǒng)一編碼)來存儲(chǔ),繪制及操作字符串。但在很多情況下你可能希望用不同的編碼來處理數(shù)據(jù)。所以Qt提供了一組QTextCodec類族來幫助用戶將非Unicode格式與Unicode格式進(jìn)行轉(zhuǎn)換. 你也可以創(chuàng)建自己的codec類。(3)創(chuàng)建窗口QWidget* pWidget=new QWidget();QWidget是所有用戶接口對(duì)象的基類。部件是用戶接口的基礎(chǔ):它從窗口系統(tǒng)接收鼠標(biāo)、鍵盤和其它事件,并在屏幕上繪制自

13、身。每個(gè)部件都是矩形的,并且以Z-order排列。每個(gè)部件都處于其父部件和子部件之間。一個(gè)沒有父部件的部件稱為一個(gè)窗口。通常,窗口有一個(gè)邊框和標(biāo)題欄,當(dāng)然也可以使用合適的標(biāo)志來創(chuàng)建一個(gè)沒有這些元素的窗口. 在Qt中, QMainWindow 以及 Qdialog的各種子類是最常用的窗口類型。每個(gè)部件的構(gòu)造函數(shù)接受一個(gè)或兩個(gè)標(biāo)準(zhǔn)的參數(shù): 第一個(gè)參數(shù)QWidget *parent = 0是此部件的父部件,如果取默認(rèn)值0,則新部件是一個(gè)窗口;如果不為0則它是parent的子部件,會(huì)被限制在parent的幾何范圍之內(nèi)。 第二個(gè)參數(shù)Qt:WindowFlags f = 0設(shè)置窗口標(biāo)志,默認(rèn)值適應(yīng)幾乎所有

14、的部件。不過如果需要沒有邊框的窗口,則需要設(shè)置特殊的標(biāo)志。(4)創(chuàng)建組件QPushButton* pushButton = new QPushButton (tr(“退出”), w);添加子組件pushButton到父組件pWidget中;也可以用setWidget()方法實(shí)現(xiàn)。pWidget->show();從頂層部件開始,依次顯示窗口中的各部件。組件創(chuàng)建時(shí)一般是不可見的,這樣的好處在于避免大量組件創(chuàng)建時(shí)造成的屏幕閃爍現(xiàn)象,要使組件可見需要調(diào)用QWidget類的成員函數(shù)show()來顯示組件。(5)注冊事件(信號(hào)槽)QObject:connect(pushButton, SIGNAL(

15、 clicked(), w, SLOT( close() );給按鈕pushButton對(duì)象添加clicked信號(hào)的處理事件槽close,關(guān)閉窗口。(6)執(zhí)行返回return app.exec();進(jìn)入主事件循環(huán),直到調(diào)用exit(), quit()或關(guān)閉主窗口,程序必須調(diào)用此函數(shù)進(jìn)入事件處理,主事件循環(huán)從窗口系統(tǒng)接收事件,并派送給相應(yīng)的部件。1.5. 執(zhí)行過程整個(gè)Qt應(yīng)用程序的執(zhí)行過程 初始化 處理事件 結(jié)束Qt應(yīng)用程序Qt 庫請(qǐng)求隊(duì)列事件隊(duì)列X server設(shè)備相關(guān)層計(jì)算機(jī)鍵盤鼠標(biāo)屏幕2. 信號(hào)槽(1)機(jī)制:QT提供了信號(hào)和槽機(jī)制。信號(hào)是一個(gè)特定的標(biāo)識(shí):一個(gè)槽就是一個(gè)函數(shù),與一般的函數(shù)不同

16、,槽函數(shù)既能夠和信號(hào)關(guān)聯(lián),又可以象普通函數(shù)一樣直接調(diào)用。當(dāng)某個(gè)事件出現(xiàn)時(shí),通過發(fā)送信號(hào),可以將與之相關(guān)的槽函數(shù)激活,即執(zhí)行槽函數(shù)代碼。信號(hào)和槽是寬松地聯(lián)系在一起的:一個(gè)發(fā)射信號(hào)的類不用知道也不用注意哪個(gè)槽要接收這個(gè)信號(hào)。Qt的信號(hào)和槽的機(jī)制可以保證如果你把一個(gè)信號(hào)和一個(gè)槽連接起來,槽會(huì)在正確的時(shí)間使用信號(hào)的參數(shù)而被調(diào)用。信號(hào)和槽可以使用任何數(shù)量、任何類型的參數(shù)。它們是完全類型安全的:不會(huì)再有回調(diào)核心轉(zhuǎn)儲(chǔ)(core dump)。 槽實(shí)際上是標(biāo)準(zhǔn)的成員函數(shù)(作為類成員的函數(shù)),因此可以直接調(diào)用它們;而且它們增加了一些特殊的功能使它們能夠連接到信號(hào)。每當(dāng)槽所連接的信號(hào)被發(fā)射時(shí),槽(函數(shù))就被執(zhí)行。信

17、號(hào)也是成員函數(shù),但是,它們的實(shí)現(xiàn)有一點(diǎn)不同。當(dāng)對(duì)象內(nèi)部發(fā)生某些事件時(shí),它能夠發(fā)出信號(hào)。如果這個(gè)信號(hào)連接到槽,那么那個(gè)槽(函數(shù))就被執(zhí)行??梢詫⒍鄠€(gè)槽連接到同一個(gè)信號(hào),那么這些槽就將一個(gè)接一個(gè)地被執(zhí)行,其執(zhí)行順序是任意的。因此,信號(hào)是一種特殊類型的函數(shù)。它們被定義為當(dāng)某個(gè)事件發(fā)生時(shí)就被發(fā)射。(2)前提:信號(hào)/槽技術(shù)非常特殊。實(shí)際上,需要特殊的編程語句才能創(chuàng)建信號(hào)和槽。因此C+編譯器不能理解這些語句,因此,完成這兩項(xiàng)工作必須使用特殊的工具,即元對(duì)象編譯器(meta object complier,MOC)。這一工具掃描源文件中用于創(chuàng)建信號(hào)和槽的特殊語句,并將它生成為有效的C+代碼。使用元對(duì)象編譯器

18、時(shí),將自定義類聲明放在頭文件中,并在第一句加上宏Q_OBJECT;再使用qmake工具生成makefile,則makefile會(huì)自動(dòng)調(diào)用moc工具對(duì)自定義信號(hào)和槽進(jìn)行處理。2.1. 聲明定義Class MyMainwindow:public QWidget Q_OBJECTPublic: MyMainwindow(); Void setValue(int);Public slots: Void ChangeValue(int);Signals: Void ValueChanged(int);注意:(1)需要將類的聲明單獨(dú)放在一個(gè)頭文件中(2)凡是包含signal和slot的類中都要加上Q_OB

19、JECT的定義(3)使用qmake工具生成makefile,或者手動(dòng)使用moc工具進(jìn)行編譯鏈接(4)slots函數(shù)修飾符可以是private、protected、public,其意義和C+中相同。(5)通常情況下,信號(hào)和槽的參數(shù)應(yīng)該是匹配的,但有時(shí)一個(gè)信號(hào)所給出的信息比其已連接槽所需要的信息要多,則可根據(jù)需要配置參數(shù)類型(或無參數(shù))。Void MyMainWindow:setValue(int value) if(value!=oldvalue) oldvalue=value; emit valueChanged(value); 注意:信號(hào)和槽一類的普通函數(shù)不同,它只能使用emit關(guān)鍵字發(fā)射。

20、2.2. 連接與取消2.2.1. 信號(hào)槽連接在signal和slot聲明以后,需要使用connect()函數(shù)將它們連接起來。connect()函數(shù)屬于QObject類的成員函數(shù),它能夠連接signal和slot,也可以用來連接signal和signal。函數(shù)原形如下:bool Connect(const Qobject* sender, const char* signal, const Qobject* receiver, const char* method, Qt:ConnectionType type=Qt:AutoConnection)(其中第參數(shù)1和參數(shù)3分別指出signal和sl

21、ot是屬于那個(gè)對(duì)象或組件,參數(shù)5為連接類型)也可以使用SIGNAL()和SLOT()這兩個(gè)宏,方法如下:QObject:connect( sender, SIGNAL(valueChanged(int), recver , SLOT(setNum(int) ); (參數(shù)1為信號(hào)發(fā)送者,參數(shù)2為發(fā)送的信號(hào),參數(shù)3為信號(hào)接收者,參數(shù)4為信號(hào)接收者的槽函數(shù)). 連接類型信號(hào)槽的連接類型Qt:connectionType有三種:(1)Qt:DirectConnection(立即連接):信號(hào)發(fā)送后立即傳遞給相關(guān)的槽,只有槽函數(shù)執(zhí)行完畢后返回后,發(fā)送信號(hào)emit之后的代碼才被執(zhí)行。(2)Qt

22、:QueuedConnection(排隊(duì)連接):信號(hào)發(fā)送后排隊(duì),直到事件循環(huán)有能力將它傳遞給槽;而不管槽函數(shù)有無執(zhí)行,發(fā)送信號(hào)之后的代碼都會(huì)立即得到執(zhí)行。(3)Qt:AutoConnection(自動(dòng)連接):如果信號(hào)和槽在同一線程,則等同于DirectConnection,如果不在同一線程,則信號(hào)將排隊(duì),等待事件循環(huán)的處理,等同于QueuedConnection。. 連接方式(1)一個(gè)信號(hào)連接一個(gè)槽QObject:connect( sender, SIGNAL(valueChanged(int), recver , SLOT(setNum(int) ); (2)一個(gè)信號(hào)連接多個(gè)槽

23、QObject:connect( sender, SIGNAL(valueChanged(int), recver1 , SLOT(setNum(int) ); QObject:connect( sender, SIGNAL(valueChanged(int), recver1 , SLOT(change(int) ); QObject:connect( sender, SIGNAL(valueChanged(int), recver 2, SLOT(update(int) ); (3)多個(gè)信號(hào)連接多一個(gè)槽QObject:connect( sender1, SIGNAL(valueChange

24、d(int), recver , SLOT(setNum(int) ); QObject:connect( sender1, SIGNAL(update(int), recver , SLOT(setNum (int) ); QObject:connect( sender2, SIGNAL(valueChanged(int), recver, SLOT(setNum (int) ); (4)一個(gè)信號(hào)連接另一個(gè)信號(hào)QObject:connect( sender, SIGNAL(valueChanged(int), recver , SIGNAL(update(int) ); 2.2.2. 信號(hào)槽

25、取消函數(shù)原形如下:QObject:disconnect(sender, SIGNAL(overflow(), recver,SLOT(handleMathError();取消一個(gè)連接不是很常用,因?yàn)镼t會(huì)在一個(gè)對(duì)象被刪除后自動(dòng)取消這個(gè)對(duì)象所包含的所有的連接。2.3. 使用方法2.3.1. 手動(dòng)連接直接使用上述信號(hào)槽連接方式連接:QObject:connect( sender, SIGNAL(valueChanged(int), recver , SLOT(setNum(int) ); 2.3.2. 自動(dòng)連接Qt的元對(duì)象提供了信號(hào)和槽的自動(dòng)關(guān)聯(lián)。如果能夠按照以下的規(guī)則命名槽函數(shù),那么QT就能夠自

26、動(dòng)進(jìn)行關(guān)聯(lián): void on_<部件對(duì)象名>_<信號(hào)名>(<信號(hào)參數(shù)>);例如:private slots:void on_browsePushBtn_clicked();等價(jià)于Connect(browsePushBtn,SIGNAL(clicked(),this,SLOT(browse();注意:(自動(dòng)連接的其它兩個(gè)必要條件)1. 自動(dòng)連接時(shí),“on_”后面為對(duì)象名,而非對(duì)象變量名;也就是說,對(duì)象名和對(duì)象變量名可以不相同;對(duì)象變量通過setObjectName()方法來指定對(duì)象名。2. 要使用自動(dòng)連接,就必須指定連接方式;通過調(diào)用QMetaObject:c

27、onnectSlotsByName()方法指明由對(duì)象名來解析信號(hào)槽連接。且該方法必須放在對(duì)象定義之后才可使用。2.4. 擴(kuò)展(1) 信號(hào)槽應(yīng)用于對(duì)象間通信。(2) 信號(hào)槽的處理借助于moc(Meta Object Compiler)工具,Q_OBJECT宏通知compiler使用moc工具進(jìn)行moc擴(kuò)展。(3) 對(duì)象中的信號(hào)不是真正的函數(shù),編譯時(shí)由moc自動(dòng)產(chǎn)生,返回類型void,槽是函數(shù)。(4) 多個(gè)被觸發(fā)者執(zhí)行順序隨機(jī)。(5) 在非跨線程場景下,槽返回后,emit()才返回。此時(shí)Object:connect函數(shù)的ConncetionType參數(shù)為Qt:DirectConnection。(6

28、) 槽參數(shù)不能有缺省值。(7) public slots:任何對(duì)象的信號(hào)或槽都可以觸發(fā);protected slots:當(dāng)前類中的對(duì)象與子類中的對(duì)象的信號(hào)或槽可以觸發(fā);private slots:本類中定義的信號(hào)或槽可以觸發(fā)。(8) 信號(hào)形參會(huì)全部傳遞給槽,但后者不一定全部接收。(9) moc 不擴(kuò)展宏,所以信號(hào)與槽參數(shù)中不能包含宏。(10) 構(gòu)造函數(shù)、嵌套類與友元類,不能在 signals: or slots: 區(qū)域內(nèi)聲明。(11) typedef之前,函數(shù)指針與模板類不能作為槽的參數(shù)。3. 布局管理QT中提供了布局管理器,可以使用它將子部件按水平或垂直方向排列起來。它可以根據(jù)上層布局管理器

29、或上層部件的空間來計(jì)算并分成若干個(gè)小盒子,然后將相應(yīng)的部件放置其中(即可以自動(dòng)調(diào)整子部件大?。?.1. 布局類型創(chuàng)建布局管理器最簡單的方法是使用派生類,當(dāng)然也可以直接使用基類來創(chuàng)建,然后指定其方向?yàn)?LeftToRight, RightToLeft, TopToBottom, 或者 BottomToTop。常用布局管理器的派生類:(1)水平布局:QHBoxLayout(2)垂直布局:QVBoxLayout(3)網(wǎng)格布局:QGridLayout(多行多列)3.2. 常用方法(1) 添加子布局管理器:如果QBoxLayout不是頂層的布局管理器,則必須將其加入到它的上層布局管理器當(dāng)中。最常用的方

30、法是:parentLayout->addLayout().(2)布局管理器添加部件:n addWidget():加入部件并設(shè)置其部件的拉伸系數(shù)。n addSpacing():創(chuàng)建一個(gè)空的小盒子,使得窗口部件之間布局更合理美觀n addStretch():創(chuàng)建一個(gè)空的,可拉伸的小盒子。n addLayout():添加另一個(gè)布局管理器并設(shè)置其拉伸系數(shù)。(3)布局管理器設(shè)置邊距:n setContentsMargins():設(shè)置一個(gè)部件的外框與布局管理器四周的距離。. n setSpacing():設(shè)置相鄰的兩個(gè)部件之間的間距。 (可以使用addSpacing()來加添間距) (4)布局管理器

31、移除部件:n removeWidget():移除一個(gè)部件n QWidget:hide():也可以將部件從布局管理器移除,除非再次調(diào)用 QWidget:show() 4. Qt樣式表QT樣式表是從QT4.2開始引入的窗口部件外觀的機(jī)制,類似于HTML的層疊樣式表。通過調(diào)用QWidget:setStyleSheet()或 Application:setStyleSheet(),你可以為一個(gè)獨(dú)立的子部件、整個(gè)窗口,甚至是整個(gè)個(gè)應(yīng)用程序指定一個(gè)樣式表。樣式表是通過QStyle的一個(gè)叫做QStyleSheetStyle的特殊子類來實(shí)現(xiàn)的。 這個(gè)特殊的子類實(shí)際上是其他的系統(tǒng)特定風(fēng)格類的包裹類, 它會(huì)把通過

32、樣式表指定的自定義外觀風(fēng)格應(yīng)用在底層的系統(tǒng)特定風(fēng)格之上。4.1. 樣式規(guī)則樣式表由一系列的樣式規(guī)則構(gòu)成,一個(gè)樣式規(guī)則由選擇器和屬性組成。語法形式如下:selector attribute: value 選擇器(selector)部分通常是一個(gè)類名(例如QComboBox),當(dāng)然也還有其他的語法形式。它確定哪些窗口部件受規(guī)則影響。屬性(attribute)部分是一個(gè)樣式表屬性的名字,值(value)部分是賦給該屬性的值。它說明了在窗口部件上應(yīng)用哪些屬性。為了使用方便,我們還可以使用一種簡化形式:selector1, selector2, ., selectorM   

33、0; attribute1: value1;    attribute2: value2;    .    attributeN: valueN;注:1. 在有的資料中,選擇器被叫作選擇符;屬性被叫作定義。2. Qt樣式表對(duì)大小寫不敏感;但對(duì)類名、對(duì)象名和屬性名大小寫敏感。(即對(duì)屬性值不區(qū)分大小寫)4.2. 特殊樣式規(guī)則4.2.1. 偽狀態(tài)樣式部件的外觀可以按照用戶界面元素狀態(tài)的不同來分別定義,這在樣式表中被稱為“偽狀態(tài)”。 選擇器可以包含偽狀態(tài)來表示窗口部件的狀態(tài),如以下定義了鼠標(biāo)在QPushButto

34、n上懸停時(shí)的規(guī)則:QPushButton:hover color:white下面是可用的偽狀態(tài)列表:偽狀態(tài)    描述:checked    button部件被選中:disabled    部件被禁用:enabled    部件被啟用:focus    部件獲得焦點(diǎn):hover    鼠標(biāo)位于部件上:indeterminate    checkbox或radiobutton被部分選中:o

35、ff    部件可以切換,且處于off狀態(tài):on    部件可以切換,且處于on狀態(tài):pressed    部件被鼠標(biāo)按下:unchecked    button部件未被選中4.2.2. 子部件微觀樣式許多部件都包含有子元素,這些元素可以稱為“子部件”。Spin box的上下箭頭就是子部件最好的例子。子部件可以通過“:”來指定,例如QDateTimeEdit:up-button。定義子部件的樣式與定義部件非常相似,它們可以擁有自己的邊框、背景等,并且也可以和偽狀態(tài)聯(lián)合使用(例

36、如QSpinBox:up-button:hover)。下表列出了可用的子部件類型:子部件    描述:down-arrow    combo box或spin box的下拉箭頭:down-button    spin box的向下按鈕:drop-down    combo box的下拉箭頭:indicator    checkbox、radio button或可選擇group box的指示器:item    menu

37、、menu bar或status bar的子項(xiàng)目:menu-indicator    push button的菜單指示器:title    group box的標(biāo)題:up-arrow    spin box的向上箭頭:up-button    spin box的向上按鈕通過指定subcontrol-position和subcontrol-origin屬性,子部件可以被放置在部件內(nèi)的任何位置。并且,子部件的位置 還可以使用相對(duì)或絕對(duì)的方式進(jìn)一步的調(diào)整。具體選擇何種調(diào)整方式取決于

38、子部件具有固定的大小,還是會(huì)隨著父部件而變化。. 相對(duì)定位相對(duì)定位適合于子部件具有固定大小的情形(通過width和height指定子部件大?。J褂眠@種方式,子部件可以以相對(duì)于subcontrol-position和 subcontrol-origin屬性定義的原始位置進(jìn)行移動(dòng)調(diào)整。例如:QPushButton:menu-indicator     image: url(menu_indicator.png);    width: 13px;    height: 13px; &#

39、160;  subcontrol-origin: padding;    subcontrol-position: bottom right;當(dāng)按下按鈕時(shí),我們可以把菜單指示器從原來的位置向右下方移動(dòng)幾個(gè)像素來模擬按鈕按下的狀態(tài)。QPushButton:menu-indicator:pressed     position: relative;    top: 2px;    left: 2px;. 絕對(duì)定位絕對(duì)定位適合于子部件的位置隨父部件的變化而變

40、的情形。與前面的例子相同,subcontrol-origin定義了父部件的參考矩形。子部件的矩形區(qū)域則可以隨后通過相對(duì)于這個(gè)參考矩形四邊的偏移量來定義。QPushButton:menu-indicator     border: 2px solid red;    subcontrol-origin: padding;    position: absolute;    top: 2px;    right: 2px;  &#

41、160; bottom: 2px;    left: 40px;對(duì)于寬度或高度固定的子部件,subcontrol-position被用來說明其在subcontrol-origin指定矩形內(nèi)的對(duì)其方式:QPushButton:menu-indicator     image: url(menu_indicator.png);    width: 13px;    subcontrol-origin: padding;    subcontrol-p

42、osition: bottom right;    position: absolute;    top: 2px;    bottom: 2px;    right: 2px;4.2.3. 層疊樣式樣式表可以在QApplication級(jí)別設(shè)置,也可以在父窗口部件,子窗口部件級(jí)別設(shè)置。實(shí)際應(yīng)用樣式時(shí),則合并這幾個(gè)級(jí)別的樣式。當(dāng)有沖突時(shí),窗口部件自身的樣式優(yōu)先使用,接下來是父窗口部件,祖先窗口部件,依次類推 。4.3. 樣式?jīng)_突解決當(dāng)不同的規(guī)則應(yīng)用到相同的屬性時(shí),樣式表就產(chǎn)生了

43、沖突。在這種情況下,特定的規(guī)則比通用的規(guī)則優(yōu)先;偽狀態(tài)比沒有偽狀態(tài)的優(yōu)先,如果級(jí)別相同,則最后一個(gè)規(guī)則優(yōu)先。5. Qt組件類5.1. 主要基類5.1.1. 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è)

44、無父的對(duì)象,如果對(duì)象是一個(gè)組件,則它就會(huì)成為頂層的窗口。QApplication和QWidget都是QObject類的子類。5.1.2. Qapplication類QApplication類負(fù)責(zé)GUI應(yīng)用程序的控制流和主要的設(shè)置,它包括主事件循環(huán)體,負(fù)責(zé)處理和調(diào)度所有來自窗口系統(tǒng)和其他資源的事件,并且處理應(yīng)用程序的開始、結(jié)束以及會(huì)話管理,還包括系統(tǒng)和應(yīng)用程序方面的設(shè)置。對(duì)于一個(gè)應(yīng)用程序來說,建立此類的對(duì)象是必不可少的。5.1.3. Qwidget類QWidget類是所有用戶接口對(duì)象的基類,它繼承了QObject類的屬性。組件(或部件)是用戶界面的單元組成部分,它接收鼠標(biāo)、鍵盤和其它從窗口系統(tǒng)來

45、的事件,并把它自己繪制在屏幕上.QWidget類有很多成員函數(shù),但一般不直接使用,而是通過子類繼承來使用其函數(shù)功能。如,QPushButton、QlistBox等都是它的子類.5.2. 常用組件類常用組件類幾乎都繼承至QWidget類,可調(diào)用其繼承來的方法。常用組件類都可直接使用其對(duì)象,也可繼承自定義類對(duì)象。5.2.1. QLebal類標(biāo)簽類QLebal,為輸出組件類;可將組件內(nèi)容輸出顯示在屏幕上。常用方法:QLabel(QWidget *parent=0, Qt:WindowFlags f=0);QLabel(const QString &text, QWidget *parent=

46、0, Qt:WindowFlags f=0);QString text() const;const QPixmap *pixmap() const;槽:void setText(const QString &);void setPixmap(const QPixmap &);5.2.2. QlineEdit類文本框類QlineEdit,為輸入組件類;可從組件中獲取輸入內(nèi)容。常用方法:QLineEdit(QWidget* parent=0);QLineEdit(const QString &, QWidget* parent=0);QString text() const

47、;QString displayText() const;int maxLength() const;void setMaxLength(int);bool isReadOnly() const;void setReadOnly(bool);槽:void setText(const QString &);void clear();void selectAll();信號(hào):void textChanged(const QString &);void textEdited(const QString &);5.2.3. QTextEdit類文本編輯區(qū)類QtextEdit,為輸

48、入組件類;可獲取組件內(nèi)文本編輯區(qū)中的內(nèi)容。常用方法:QTextEdit(QWidget *parent = 0);QTextEdit(const QString &text, QWidget *parent = 0);void setTextCursor(const QTextCursor &cursor);QTextCursor textCursor() const;bool isReadOnly() const;void setReadOnly(bool ro);槽:void setPlainText(const QString &text);void setTex

49、t(const QString &text);void cut();void copy();void paste();void clear();void selectAll();void append(const QString &text);信號(hào):void textChanged();void copyAvailable(bool b);void selectionChanged();5.2.4. QComboBox類下拉列表框類QcomboBox,為輸入組件類;可獲取用戶選擇的列表項(xiàng)。常用方法:QComboBox(QWidget *parent = 0);int count

50、() const;void setIconSize(const QSize &size);bool isEditable() const;void setEditable(bool editable);int currentIndex() const;QString currentText() const;QString itemText(int index) const;QIcon itemIcon(int index) const;void addItems(const QStringList &texts)void insertItems(int index, const

51、 QStringList &texts);void removeItem(int index);槽:void clear();void setCurrentIndex(int index);信號(hào):void activated(int index);void activated(const QString &);void currentIndexChanged(int index);void currentIndexChanged(const QString &);5.2.5. QpushButton類按鈕類QpushButton,通常為信號(hào)(或事件)發(fā)起者。常用方法:Q

52、PushButton(QWidget *parent=0);QPushButton(const QString &text, QWidget *parent=0);QPushButton(const QIcon& icon, const QString &text, QWidget *parent=0);void setText(const QString &text);QString text() const;void setIcon(const QIcon &icon);QIcon icon() const;bool isChecked() cons

53、t;槽:void click();void setChecked(bool);信號(hào):void pressed();void released();void clicked(bool checked = false);5.2.6. QDialog類(1) 文件對(duì)話框QfileDialog,常用方法:static QString getOpenFileName(QWidget *parent = 0, const QString &caption = QString(), const QString &dir = QString(), const QString &filt

54、er = QString(), QString *selectedFilter = 0, Options options = 0);static QString getSaveFileName(QWidget *parent = 0, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, Options options = 0);(2) 顏色對(duì)話框QcolorDi

55、alog,常用方法:static QColor getColor(const QColor &initial = Qt:white, QWidget *parent = 0);(3) 字體對(duì)話框QfontDialog,常用方法:static QFont getFont(bool *ok, QWidget *parent = 0);5.2.7. QMessageBox類(1) Question詢問消息框,常用方法:static int question(QWidget *parent, const QString &title, const QString& text,

56、int button0, int button1 = 0, int button2 = 0);(2) Information操作提示消息框,常用方法:static int information(QWidget *parent, const QString &title, const QString& text, int button0, int button1 = 0, int button2 = 0);(3) Warning警告消息框,常用方法:static int warning(QWidget *parent, const QString &title, con

57、st QString& text, int button0, int button1, int button2 = 0);(4) Critical嚴(yán)重錯(cuò)誤消息框,常用方法:static int critical(QWidget *parent, const QString &title, const QString& text, int button0, int button1, int button2 = 0);(5) About信息提示框,常用方法:static void about(QWidget *parent, const QString &title, const QString &text);(6) aboutQt QT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論