




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、QT編程基礎(chǔ)1. QT簡介1.1. 簡介(1)Qt是Trolltech公司的標(biāo)志性產(chǎn)品,是一個跨平臺的C+圖形用戶界面(GUI)工具包。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級的圖形用戶界面所需的所有功能。Qt是完全面向?qū)ο蟮暮苋菀讛U展,并且允許真正地組件編程。(2)Qt支持下述平臺: MS/Windows - 95、98、NT 4.0、ME、2000 Unix/X11 - Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX和其它X11平臺 Macintosh - Mac OS X Embedded - 有幀緩沖(framebuffer
2、)支持的Linux平臺。 (3)Trolltech公司采用雙重授權(quán)模式,一種用于商業(yè)性質(zhì)的授權(quán),一種用于免費的開源授權(quán)。Qt企業(yè)版和Qt專業(yè)版提供給商業(yè)軟件開發(fā)。它們提供傳統(tǒng)商業(yè)軟件發(fā)行版并且提供免費升級和技術(shù)支持服務(wù)。Qt自由版是Qt僅僅為了開發(fā)自由和開放源碼軟件提供的Unix/X11版本。在GPL協(xié)議下,它是免費的。Qt/E自由版是Qt為了開發(fā)自由軟件提供的嵌入式版本。在GPL協(xié)議下,它是免費的。1.2. 特點(1)可移植性:QT不僅適用于UNIX,同樣適用于Windows。為了同時擁有世界上幾百萬UNIX用戶以及幾百萬的Windows用戶,最好的辦法是采用一個既適用于UNIX,又適用于W
3、indows的GUI工具包,其答案是QT。(2)易用性:Qt為專業(yè)應(yīng)用提供了大量的函數(shù),在Qt的API中含有大約250個C+類,大多數(shù)的類都是GUI專有。而且QT是基于C+構(gòu)造,所以QT也具有面向?qū)ο缶幊痰乃袃?yōu)點。(3)構(gòu)件支持:Qt提供信號(signal)和插槽(slot)概念,這是一種類型安全的方法,它允許回調(diào),并支持對象之間在彼此不知道對方信息的情況下進(jìn)行合作,這使得Qt非常適合于真正的構(gòu)件編程。(4)國際化:Qt為本地化應(yīng)用提供了完全的支持,所有用戶界面文本都可以基于消息翻譯表被翻譯成各國語言,Qt還支持雙字節(jié)16bit國際字符標(biāo)準(zhǔn)。(5)運行速度:QT非常容易使用,且也具有很快的速
4、度。QT的易用性和快速是密不可分的。這一優(yōu)點要歸功于QT開發(fā)者的辛苦工作,他們花費了大量的時間來優(yōu)化他們的產(chǎn)品。QT比其他許多GUI工具包運行速度快的原因是其實現(xiàn)方式。QT是一個GUI仿真工具包,即它不使用本地工具包作調(diào)用,而是使用各自平臺上的低級繪圖函數(shù),從而提高程序速度。1.3. QT工程1.3.1. Qt工程編輯以下是編寫Qt工程文件(*.Pro)的變量說明:(1) TEMPLATE 變量TEMPLATE描述了為建立目標(biāo)文件而采用何種模板,即生成何種形式的Makefile文件。qmake工具定義了5種模板: 應(yīng)用程序App,為建立一個Qt應(yīng)用程序創(chuàng)建Makefile文件;
5、60;庫lib,為建立引用程序庫而創(chuàng)建Makefile文件; 子工程subdirs,為建立子目錄下的目標(biāo)文件創(chuàng)建一個Makefile文件,子目錄通過變量SUBDIRS指定(子目錄下的工程文件也需要指出使用何種模板); VC應(yīng)用程序vcapp,為Visual Studio 生成一個應(yīng)用程序工程。僅僅用語Windos操作系統(tǒng). VC庫vclib,為Visual Studio生成一個應(yīng)用程序庫工程,僅僅用語Windows操作系統(tǒng).(2)TARGET 描述了目標(biāo)文件的名稱, 也就是應(yīng)用程序的名字(或者說exe文件的名稱)。如果不設(shè)置, 與pro文件名稱相同。(3
6、)DEPENDPATH 描述了建立應(yīng)用程序所依賴的其他文件所在的路徑.(4)INCLUDEPATH 描述了編譯該工程時編譯器需要搜索的#include路徑.HAND(5)SOURCES 告訴編譯器, 源代碼文件路徑及其文件名字.(6)DESTDIR 定義了exe文件的路徑.(7)CONFIG 定義了編譯選項 debug : 表示建立的目標(biāo)代碼是調(diào)試版本, 如果沒有則為Release版本. warn_on : 要求編譯器在編譯應(yīng)用程序時打開警告開關(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工程編譯編譯一個C+應(yīng)用程序,你需要創(chuàng)建一個makefile。創(chuàng)建一個Q
9、t 的makefile 的最容易的方法是使用Qt 提供的連編工具qmake。如果你已經(jīng)把main.cpp 保存到它自己的目錄了,你所要做的就是這些:qmake -projectqmake第一個命令調(diào)用qmake 來生成一個.pro(項目)文件。第二個命令根據(jù)這個項目文件來生成一個(系統(tǒng)相關(guān)的)makefile。你現(xiàn)在可以輸入make(或者nmake,如果你使用Visual Studio),然后運行你的第一個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)用程序中,首先要創(chuàng)建一個QApplic
11、ation對象,QApplication類負(fù)責(zé)圖形用戶界面應(yīng)用程序的控制流和主要設(shè)置。它包含在main()函數(shù)的事件循環(huán)體中,對所有來自Window系統(tǒng)和其它源文件的事件進(jìn)行處理和調(diào)度,還包括處理應(yīng)用程序的初始化和結(jié)束,并且提供會話管理。它還處理系統(tǒng)級和應(yīng)用程序級的設(shè)置。在Qt應(yīng)用程序中,不管有多少個窗口,QApplication對象只能有一個,而且必須在其他對象之前創(chuàng)建。(2)國際化QTextCodec:setCodecForTr(QTextCodec:codecForLocale()setCodecForTr函數(shù)可以設(shè)置QObject:tr()的編碼方式,如果采用默認(rèn)值,則會是Latin-
12、1.假若程序中出現(xiàn)的字符不是Latin-1編碼方式,這個函數(shù)可以用來設(shè)置正確的編碼方式。而codecForLocale函數(shù)返回了本地區(qū)的編碼方式的codec指針。Qt使用Unicode(統(tǒng)一編碼)來存儲,繪制及操作字符串。但在很多情況下你可能希望用不同的編碼來處理數(shù)據(jù)。所以Qt提供了一組QTextCodec類族來幫助用戶將非Unicode格式與Unicode格式進(jìn)行轉(zhuǎn)換. 你也可以創(chuàng)建自己的codec類。(3)創(chuàng)建窗口QWidget* pWidget=new QWidget();QWidget是所有用戶接口對象的基類。部件是用戶接口的基礎(chǔ):它從窗口系統(tǒng)接收鼠標(biāo)、鍵盤和其它事件,并在屏幕上繪制自
13、身。每個部件都是矩形的,并且以Z-order排列。每個部件都處于其父部件和子部件之間。一個沒有父部件的部件稱為一個窗口。通常,窗口有一個邊框和標(biāo)題欄,當(dāng)然也可以使用合適的標(biāo)志來創(chuàng)建一個沒有這些元素的窗口. 在Qt中, QMainWindow 以及 Qdialog的各種子類是最常用的窗口類型。每個部件的構(gòu)造函數(shù)接受一個或兩個標(biāo)準(zhǔn)的參數(shù): 第一個參數(shù)QWidget *parent = 0是此部件的父部件,如果取默認(rèn)值0,則新部件是一個窗口;如果不為0則它是parent的子部件,會被限制在parent的幾何范圍之內(nèi)。 第二個參數(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()方法實現(xiàn)。pWidget->show();從頂層部件開始,依次顯示窗口中的各部件。組件創(chuàng)建時一般是不可見的,這樣的好處在于避免大量組件創(chuàng)建時造成的屏幕閃爍現(xiàn)象,要使組件可見需要調(diào)用QWidget類的成員函數(shù)show()來顯示組件。(5)注冊事件(信號槽)QObject:connect(pushButton, SIGNAL(
15、 clicked(), w, SLOT( close() );給按鈕pushButton對象添加clicked信號的處理事件槽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í)行過程整個Qt應(yīng)用程序的執(zhí)行過程 初始化 處理事件 結(jié)束Qt應(yīng)用程序Qt 庫請求隊列事件隊列X server設(shè)備相關(guān)層計算機鍵盤鼠標(biāo)屏幕2. 信號槽(1)機制:QT提供了信號和槽機制。信號是一個特定的標(biāo)識:一個槽就是一個函數(shù),與一般的函數(shù)不同
16、,槽函數(shù)既能夠和信號關(guān)聯(lián),又可以象普通函數(shù)一樣直接調(diào)用。當(dāng)某個事件出現(xiàn)時,通過發(fā)送信號,可以將與之相關(guān)的槽函數(shù)激活,即執(zhí)行槽函數(shù)代碼。信號和槽是寬松地聯(lián)系在一起的:一個發(fā)射信號的類不用知道也不用注意哪個槽要接收這個信號。Qt的信號和槽的機制可以保證如果你把一個信號和一個槽連接起來,槽會在正確的時間使用信號的參數(shù)而被調(diào)用。信號和槽可以使用任何數(shù)量、任何類型的參數(shù)。它們是完全類型安全的:不會再有回調(diào)核心轉(zhuǎn)儲(core dump)。 槽實際上是標(biāo)準(zhǔn)的成員函數(shù)(作為類成員的函數(shù)),因此可以直接調(diào)用它們;而且它們增加了一些特殊的功能使它們能夠連接到信號。每當(dāng)槽所連接的信號被發(fā)射時,槽(函數(shù))就被執(zhí)行。信
17、號也是成員函數(shù),但是,它們的實現(xiàn)有一點不同。當(dāng)對象內(nèi)部發(fā)生某些事件時,它能夠發(fā)出信號。如果這個信號連接到槽,那么那個槽(函數(shù))就被執(zhí)行??梢詫⒍鄠€槽連接到同一個信號,那么這些槽就將一個接一個地被執(zhí)行,其執(zhí)行順序是任意的。因此,信號是一種特殊類型的函數(shù)。它們被定義為當(dāng)某個事件發(fā)生時就被發(fā)射。(2)前提:信號/槽技術(shù)非常特殊。實際上,需要特殊的編程語句才能創(chuàng)建信號和槽。因此C+編譯器不能理解這些語句,因此,完成這兩項工作必須使用特殊的工具,即元對象編譯器(meta object complier,MOC)。這一工具掃描源文件中用于創(chuàng)建信號和槽的特殊語句,并將它生成為有效的C+代碼。使用元對象編譯器
18、時,將自定義類聲明放在頭文件中,并在第一句加上宏Q_OBJECT;再使用qmake工具生成makefile,則makefile會自動調(diào)用moc工具對自定義信號和槽進(jìn)行處理。2.1. 聲明定義Class MyMainwindow:public QWidget Q_OBJECTPublic: MyMainwindow(); Void setValue(int);Public slots: Void ChangeValue(int);Signals: Void ValueChanged(int);注意:(1)需要將類的聲明單獨放在一個頭文件中(2)凡是包含signal和slot的類中都要加上Q_OB
19、JECT的定義(3)使用qmake工具生成makefile,或者手動使用moc工具進(jìn)行編譯鏈接(4)slots函數(shù)修飾符可以是private、protected、public,其意義和C+中相同。(5)通常情況下,信號和槽的參數(shù)應(yīng)該是匹配的,但有時一個信號所給出的信息比其已連接槽所需要的信息要多,則可根據(jù)需要配置參數(shù)類型(或無參數(shù))。Void MyMainWindow:setValue(int value) if(value!=oldvalue) oldvalue=value; emit valueChanged(value); 注意:信號和槽一類的普通函數(shù)不同,它只能使用emit關(guān)鍵字發(fā)射。
20、2.2. 連接與取消2.2.1. 信號槽連接在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是屬于那個對象或組件,參數(shù)5為連接類型)也可以使用SIGNAL()和SLOT()這兩個宏,方法如下:QObject:connect( sender, SIGNAL(valueChanged(int), recver , SLOT(setNum(int) ); (參數(shù)1為信號發(fā)送者,參數(shù)2為發(fā)送的信號,參數(shù)3為信號接收者,參數(shù)4為信號接收者的槽函數(shù)). 連接類型信號槽的連接類型Qt:connectionType有三種:(1)Qt:DirectConnection(立即連接):信號發(fā)送后立即傳遞給相關(guān)的槽,只有槽函數(shù)執(zhí)行完畢后返回后,發(fā)送信號emit之后的代碼才被執(zhí)行。(2)Qt
22、:QueuedConnection(排隊連接):信號發(fā)送后排隊,直到事件循環(huán)有能力將它傳遞給槽;而不管槽函數(shù)有無執(zhí)行,發(fā)送信號之后的代碼都會立即得到執(zhí)行。(3)Qt:AutoConnection(自動連接):如果信號和槽在同一線程,則等同于DirectConnection,如果不在同一線程,則信號將排隊,等待事件循環(huán)的處理,等同于QueuedConnection。. 連接方式(1)一個信號連接一個槽QObject:connect( sender, SIGNAL(valueChanged(int), recver , SLOT(setNum(int) ); (2)一個信號連接多個槽
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)多個信號連接多一個槽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)一個信號連接另一個信號QObject:connect( sender, SIGNAL(valueChanged(int), recver , SIGNAL(update(int) ); 2.2.2. 信號槽
25、取消函數(shù)原形如下:QObject:disconnect(sender, SIGNAL(overflow(), recver,SLOT(handleMathError();取消一個連接不是很常用,因為Qt會在一個對象被刪除后自動取消這個對象所包含的所有的連接。2.3. 使用方法2.3.1. 手動連接直接使用上述信號槽連接方式連接:QObject:connect( sender, SIGNAL(valueChanged(int), recver , SLOT(setNum(int) ); 2.3.2. 自動連接Qt的元對象提供了信號和槽的自動關(guān)聯(lián)。如果能夠按照以下的規(guī)則命名槽函數(shù),那么QT就能夠自
26、動進(jìn)行關(guān)聯(lián): void on_<部件對象名>_<信號名>(<信號參數(shù)>);例如:private slots:void on_browsePushBtn_clicked();等價于Connect(browsePushBtn,SIGNAL(clicked(),this,SLOT(browse();注意:(自動連接的其它兩個必要條件)1. 自動連接時,“on_”后面為對象名,而非對象變量名;也就是說,對象名和對象變量名可以不相同;對象變量通過setObjectName()方法來指定對象名。2. 要使用自動連接,就必須指定連接方式;通過調(diào)用QMetaObject:c
27、onnectSlotsByName()方法指明由對象名來解析信號槽連接。且該方法必須放在對象定義之后才可使用。2.4. 擴展(1) 信號槽應(yīng)用于對象間通信。(2) 信號槽的處理借助于moc(Meta Object Compiler)工具,Q_OBJECT宏通知compiler使用moc工具進(jìn)行moc擴展。(3) 對象中的信號不是真正的函數(shù),編譯時由moc自動產(chǎn)生,返回類型void,槽是函數(shù)。(4) 多個被觸發(fā)者執(zhí)行順序隨機。(5) 在非跨線程場景下,槽返回后,emit()才返回。此時Object:connect函數(shù)的ConncetionType參數(shù)為Qt:DirectConnection。(6
28、) 槽參數(shù)不能有缺省值。(7) public slots:任何對象的信號或槽都可以觸發(fā);protected slots:當(dāng)前類中的對象與子類中的對象的信號或槽可以觸發(fā);private slots:本類中定義的信號或槽可以觸發(fā)。(8) 信號形參會全部傳遞給槽,但后者不一定全部接收。(9) moc 不擴展宏,所以信號與槽參數(shù)中不能包含宏。(10) 構(gòu)造函數(shù)、嵌套類與友元類,不能在 signals: or slots: 區(qū)域內(nèi)聲明。(11) typedef之前,函數(shù)指針與模板類不能作為槽的參數(shù)。3. 布局管理QT中提供了布局管理器,可以使用它將子部件按水平或垂直方向排列起來。它可以根據(jù)上層布局管理器
29、或上層部件的空間來計算并分成若干個小盒子,然后將相應(yīng)的部件放置其中(即可以自動調(diào)整子部件大?。?。3.1. 布局類型創(chuàng)建布局管理器最簡單的方法是使用派生類,當(dāng)然也可以直接使用基類來創(chuàng)建,然后指定其方向為 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)建一個空的小盒子,使得窗口部件之間布局更合理美觀n addStretch():創(chuàng)建一個空的,可拉伸的小盒子。n addLayout():添加另一個布局管理器并設(shè)置其拉伸系數(shù)。(3)布局管理器設(shè)置邊距:n setContentsMargins():設(shè)置一個部件的外框與布局管理器四周的距離。. n setSpacing():設(shè)置相鄰的兩個部件之間的間距。 (可以使用addSpacing()來加添間距) (4)布局管理器
31、移除部件:n removeWidget():移除一個部件n QWidget:hide():也可以將部件從布局管理器移除,除非再次調(diào)用 QWidget:show() 4. Qt樣式表QT樣式表是從QT4.2開始引入的窗口部件外觀的機制,類似于HTML的層疊樣式表。通過調(diào)用QWidget:setStyleSheet()或 Application:setStyleSheet(),你可以為一個獨立的子部件、整個窗口,甚至是整個個應(yīng)用程序指定一個樣式表。樣式表是通過QStyle的一個叫做QStyleSheetStyle的特殊子類來實現(xiàn)的。 這個特殊的子類實際上是其他的系統(tǒng)特定風(fēng)格類的包裹類, 它會把通過
32、樣式表指定的自定義外觀風(fēng)格應(yīng)用在底層的系統(tǒng)特定風(fēng)格之上。4.1. 樣式規(guī)則樣式表由一系列的樣式規(guī)則構(gòu)成,一個樣式規(guī)則由選擇器和屬性組成。語法形式如下:selector attribute: value 選擇器(selector)部分通常是一個類名(例如QComboBox),當(dāng)然也還有其他的語法形式。它確定哪些窗口部件受規(guī)則影響。屬性(attribute)部分是一個樣式表屬性的名字,值(value)部分是賦給該屬性的值。它說明了在窗口部件上應(yīng)用哪些屬性。為了使用方便,我們還可以使用一種簡化形式:selector1, selector2, ., selectorM
33、0; attribute1: value1; attribute2: value2; . attributeN: valueN;注:1. 在有的資料中,選擇器被叫作選擇符;屬性被叫作定義。2. Qt樣式表對大小寫不敏感;但對類名、對象名和屬性名大小寫敏感。(即對屬性值不區(qū)分大小寫)4.2. 特殊樣式規(guī)則4.2.1. 偽狀態(tài)樣式部件的外觀可以按照用戶界面元素狀態(tài)的不同來分別定義,這在樣式表中被稱為“偽狀態(tài)”。 選擇器可以包含偽狀態(tài)來表示窗口部件的狀態(tài),如以下定義了鼠標(biāo)在QPushButto
34、n上懸停時的規(guī)則:QPushButton:hover color:white下面是可用的偽狀態(tài)列表:偽狀態(tài) 描述:checked button部件被選中:disabled 部件被禁用:enabled 部件被啟用:focus 部件獲得焦點: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的子項目:menu-indicator push button的菜單指示器:title group box的標(biāo)題:up-arrow spin box的向上箭頭:up-button spin box的向上按鈕通過指定subcontrol-position和subcontrol-origin屬性,子部件可以被放置在部件內(nèi)的任何位置。并且,子部件的位置 還可以使用相對或絕對的方式進(jìn)一步的調(diào)整。具體選擇何種調(diào)整方式取決于
38、子部件具有固定的大小,還是會隨著父部件而變化。. 相對定位相對定位適合于子部件具有固定大小的情形(通過width和height指定子部件大?。?。使用這種方式,子部件可以以相對于subcontrol-position和 subcontrol-origin屬性定義的原始位置進(jìn)行移動調(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)按下按鈕時,我們可以把菜單指示器從原來的位置向右下方移動幾個像素來模擬按鈕按下的狀態(tài)。QPushButton:menu-indicator:pressed position: relative; top: 2px; left: 2px;. 絕對定位絕對定位適合于子部件的位置隨父部件的變化而變
40、的情形。與前面的例子相同,subcontrol-origin定義了父部件的參考矩形。子部件的矩形區(qū)域則可以隨后通過相對于這個參考矩形四邊的偏移量來定義。QPushButton:menu-indicator border: 2px solid red; subcontrol-origin: padding; position: absolute; top: 2px; right: 2px;
41、160; bottom: 2px; left: 40px;對于寬度或高度固定的子部件,subcontrol-position被用來說明其在subcontrol-origin指定矩形內(nèi)的對其方式: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級別設(shè)置,也可以在父窗口部件,子窗口部件級別設(shè)置。實際應(yīng)用樣式時,則合并這幾個級別的樣式。當(dāng)有沖突時,窗口部件自身的樣式優(yōu)先使用,接下來是父窗口部件,祖先窗口部件,依次類推 。4.3. 樣式?jīng)_突解決當(dāng)不同的規(guī)則應(yīng)用到相同的屬性時,樣式表就產(chǎn)生了
43、沖突。在這種情況下,特定的規(guī)則比通用的規(guī)則優(yōu)先;偽狀態(tài)比沒有偽狀態(tài)的優(yōu)先,如果級別相同,則最后一個規(guī)則優(yōu)先。5. Qt組件類5.1. 主要基類5.1.1. Qobject類QObject類是所有能夠處理signal、slot和事件的Qt對象的基類,原形如下:QObject:QObject ( QObject * parent =0, const char * name = 0 ) 創(chuàng)建帶有父對象及其名字的對象,對象的父對象可以看作為這個對象的所有者。比如,對話框是其中的ok和cancel按鈕的父對象。在上面的函數(shù)中如果parent為0則構(gòu)造一個
44、無父的對象,如果對象是一個組件,則它就會成為頂層的窗口。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é)束以及會話管理,還包括系統(tǒng)和應(yīng)用程序方面的設(shè)置。對于一個應(yīng)用程序來說,建立此類的對象是必不可少的。5.1.3. Qwidget類QWidget類是所有用戶接口對象的基類,它繼承了QObject類的屬性。組件(或部件)是用戶界面的單元組成部分,它接收鼠標(biāo)、鍵盤和其它從窗口系統(tǒng)來
45、的事件,并把它自己繪制在屏幕上.QWidget類有很多成員函數(shù),但一般不直接使用,而是通過子類繼承來使用其函數(shù)功能。如,QPushButton、QlistBox等都是它的子類.5.2. 常用組件類常用組件類幾乎都繼承至QWidget類,可調(diào)用其繼承來的方法。常用組件類都可直接使用其對象,也可繼承自定義類對象。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();信號: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);信號:void textChanged();void copyAvailable(bool b);void selectionChanged();5.2.4. QComboBox類下拉列表框類QcomboBox,為輸入組件類;可獲取用戶選擇的列表項。常用方法: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);信號:void activated(int index);void activated(const QString &);void currentIndexChanged(int index);void currentIndexChanged(const QString &);5.2.5. QpushButton類按鈕類QpushButton,通常為信號(或事件)發(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);信號:void pressed();void released();void clicked(bool checked = false);5.2.6. QDialog類(1) 文件對話框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) 顏色對話框QcolorDi
55、alog,常用方法:static QColor getColor(const QColor &initial = Qt:white, QWidget *parent = 0);(3) 字體對話框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)重錯誤消息框,常用方法: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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 系統(tǒng)架構(gòu)設(shè)計師備考效率的提升與評估方法分享試題及答案
- 別墅項目施工合同樣本
- 做資料合同樣本
- 小川崎病試題及答案
- 產(chǎn)品售貨合同樣本
- 激光技術(shù)考試信息解讀試題及答案
- 激光工藝優(yōu)化的方法與實踐試題及答案
- 系統(tǒng)架構(gòu)師職業(yè)發(fā)展趨勢分析試題及答案
- 系統(tǒng)架構(gòu)設(shè)計師職業(yè)與考試知識的相輔相成分析試題及答案
- 藥物個體化治療的實踐試題及答案
- 軍隊文職人員轉(zhuǎn)正述職報告
- 大學(xué)生勞動教育(微課版)全書教案
- 公司道德和商業(yè)行為準(zhǔn)則
- 13G322-1~4鋼筋混凝土過梁(2013年合訂本)
- 【年產(chǎn)1000噸富硒沙棘果汁工藝生產(chǎn)設(shè)計16000字(論文)】
- 電驅(qū)動橋技術(shù)及技術(shù)路線-2024-06-技術(shù)資料
- 職業(yè)素養(yǎng)提升第2版(大學(xué)生職業(yè)素養(yǎng)指導(dǎo)課程)全套教學(xué)課件
- 中考數(shù)學(xué)專題復(fù)習(xí)《代數(shù)推理題》知識點梳理及典例講解課件
- 抖音電商直播運營團隊組織架構(gòu)與職責(zé)說明
- 直流伺服電機控制系統(tǒng)設(shè)計
- 河道護坡工程安全管理體系與措施
評論
0/150
提交評論