999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Qt的狀態(tài)轉(zhuǎn)換機(jī)制的研究

2013-04-12 00:00:00袁媛王玥黃少華高菲
現(xiàn)代電子技術(shù) 2013年8期

摘 要: 研究了跨平臺類庫Qt的狀態(tài)轉(zhuǎn)換機(jī)制。介紹了QState類和QStateMachine類,對狀態(tài)機(jī)中的歷史狀態(tài)、復(fù)合狀態(tài)、平行狀態(tài)做了詳解,并給出了關(guān)鍵代碼。在軟件開發(fā)中,應(yīng)用Qt狀態(tài)轉(zhuǎn)換機(jī)制能夠簡化編程過程。經(jīng)過實(shí)際的軟件研發(fā),結(jié)果表明,在開發(fā)交互式應(yīng)用程序和動畫應(yīng)用程序時(shí)應(yīng)用Qt狀態(tài)轉(zhuǎn)換機(jī)制更能提高編程效率。

關(guān)鍵詞: Qt; QState; 狀態(tài)機(jī); 狀態(tài)轉(zhuǎn)換機(jī)制; 編程過程簡化

中圖分類號: TN919?34; TP391.9 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2013)08?0121?04

0 引 言

Qt中狀態(tài)機(jī)(QStateMachine)的設(shè)計(jì)來源于有限狀態(tài)機(jī)的概念,主要負(fù)責(zé)程序運(yùn)行過程中不同狀態(tài)間切換的管理工作。有限狀態(tài)機(jī)(FSM)又稱為有限狀態(tài)自動機(jī)或簡稱狀態(tài)機(jī),是表示有限個(gè)狀態(tài)以及這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學(xué)模型。狀態(tài)存儲關(guān)于過去的信息,就是說它反映從系統(tǒng)開始時(shí)刻到當(dāng)前時(shí)刻的輸入變化。轉(zhuǎn)移指示狀態(tài)變更,并且用滿足轉(zhuǎn)移發(fā)生的條件來描述它。動作是在給定時(shí)刻要進(jìn)行的活動的描述。有多種類型的動作,如在進(jìn)入狀態(tài)時(shí)發(fā)生的進(jìn)入動作;在退出狀態(tài)時(shí)發(fā)生的退出動作;在特定轉(zhuǎn)移時(shí)發(fā)生時(shí)的轉(zhuǎn)移動作;還有輸入動作,它依賴于當(dāng)前狀態(tài)和輸入條件。

1 簡 介

1.1 Qt類庫

Qt是一個(gè)圖形庫,它實(shí)現(xiàn)了對X Window的封裝,就如同Windows平臺上MFC對Windows的封裝。在Linux平臺上,還有其他性質(zhì)相同的圖形開發(fā)工具,比較有名的有Motif, Gtk+,Openwin等。與后幾種不同的是Qt還是跨平臺的,它也支持Windows系列的操作系統(tǒng)[1]。Qt給應(yīng)用程序開發(fā)者提供建立藝術(shù)級圖形用戶界面所需的所有功能。它完全面向?qū)ο?,很容易擴(kuò)展,并且允許真正的組件編程[2]。

Qt組件庫有開發(fā)速度快,代碼復(fù)用效率高,易于學(xué)習(xí)掌握的特點(diǎn)。尤其他強(qiáng)大的可移植性符合軟件工程中軟件復(fù)用技術(shù)的要求,而且其可以與Motif/Xt組件庫進(jìn)行混合編程,與OpenGL集成,且與C++及C都兼容[3]。

Qt于1996年進(jìn)入商業(yè)領(lǐng)域,已成為全世界范圍內(nèi)數(shù)千種成功的應(yīng)用程序的基礎(chǔ),還是Linux桌面環(huán)境KDE的基礎(chǔ)。

Qt提取了窗口和操作系統(tǒng)的底層基礎(chǔ)構(gòu)造函數(shù),為軟件開發(fā)工程師提供了一致的邏輯界面,Qt API在所有支持的平臺上都是相同的。事實(shí)上,這是通過對不同平臺(Linux, Windows,and Mac)的專有API進(jìn)行了封裝,如文件處理、網(wǎng)絡(luò)(操作,協(xié)議),進(jìn)程處理、線程、數(shù)據(jù)庫訪問等而完成的。所以Qt應(yīng)用的開發(fā)和部署與平臺無關(guān),同一套源代碼,通過Qt編譯可以在所有支持的平臺上進(jìn)行本地化運(yùn)行[4]。

1.2 Qt信號和槽的機(jī)制

Qt提供了信號和槽機(jī)制來完成界面操作的響應(yīng),這一機(jī)制是完成任意2個(gè)Qt對象之間的通信機(jī)制。信號是一個(gè)特定的標(biāo)識;槽是一個(gè)函數(shù),與一般的函數(shù)不同,槽函數(shù)既能夠和信號關(guān)聯(lián),也能夠像普通函數(shù)一樣直接調(diào)用[5]。每個(gè)Qt對象都包含若干個(gè)預(yù)定義的信號和若干個(gè)預(yù)定義的槽,當(dāng)某一個(gè)特定事件發(fā)生時(shí),一個(gè)信號被發(fā)射,與信號相關(guān)聯(lián)的槽則會響應(yīng)信號并完成相應(yīng)的處理。當(dāng)一個(gè)類被繼承時(shí),該類的信號和槽也同時(shí)被繼承,也可以根據(jù)需要自定義信號和槽。

信號和槽機(jī)制是類型安全的[6],需要關(guān)聯(lián)的信號和槽的簽名必須是等同的,即信號的參數(shù)類型和參數(shù)個(gè)數(shù)同接收該信號的槽的參數(shù)類型和參數(shù)個(gè)數(shù)相同。不過,一個(gè)槽的參數(shù)個(gè)數(shù)是可以少于信號的參數(shù)個(gè)數(shù)的,但缺少的參數(shù)必須是信號參數(shù)的最后一個(gè)或幾個(gè)參數(shù)。如果信號和槽的簽名不符,編譯器就會報(bào)錯(cuò)。

信號和槽機(jī)制是松散耦合的,減弱了Qt對象的耦合度。激發(fā)信號的Qt對象無需知道是哪個(gè)對象的哪個(gè)槽需要接收它發(fā)出的信號,它只需做的是在適當(dāng)?shù)臅r(shí)間發(fā)送適當(dāng)?shù)男盘柧涂梢粤耍恍枰酪膊魂P(guān)心它的信號有沒有被接收到,更不需要知道是哪個(gè)對象的哪個(gè)槽接收到了信號;同樣的,對象的槽也不知道是哪些信號關(guān)聯(lián)到了自己,而一旦關(guān)聯(lián)信號和槽,Qt就保證了適合的槽得到了調(diào)用。即使關(guān)聯(lián)的對象在運(yùn)行時(shí)被刪除,應(yīng)用程序也不會出現(xiàn)崩潰。

信號和槽機(jī)制增強(qiáng)了對象間通信的靈活性,然而這也損失了一些性能。同回調(diào)函數(shù)相比較,信號和槽機(jī)制有些慢。通常,通過傳遞一個(gè)信號來調(diào)用槽函數(shù)將比直接調(diào)用非虛函數(shù)慢10倍。

原因主要有:需要定位接收信號的對象;安全地遍歷所有的關(guān)聯(lián)(例如,一個(gè)信號關(guān)聯(lián)到多個(gè)槽的情況);編組/解組傳遞的參數(shù);多線程的時(shí)候,信號可能需要排隊(duì)等待。

然而,與創(chuàng)建堆對象的new操作以及刪除堆對象的delete操作相比較,信號和槽的代價(jià)只是它們很少的一部分。信號和槽機(jī)制導(dǎo)致的這點(diǎn)性能損耗,對實(shí)時(shí)應(yīng)用程序是可以忽略的;同信號和槽提供的靈活性和簡便性相比,這點(diǎn)性能的損失也是值得的[7]。

2 狀態(tài)轉(zhuǎn)換機(jī)制簡介

Qt的狀態(tài)機(jī)由若干狀態(tài)、輸入和轉(zhuǎn)換函數(shù)組成。設(shè)計(jì)狀態(tài)機(jī)時(shí)要描述清楚狀態(tài)機(jī)的要素,即如何進(jìn)行狀態(tài)轉(zhuǎn)移,每個(gè)狀態(tài)的輸出是什么,狀態(tài)轉(zhuǎn)移的條件等。且要求狀態(tài)機(jī)不能進(jìn)入死循環(huán)和非預(yù)知的狀態(tài)[8]。

2.1 QState類

QState類為QStateMachine類提供狀態(tài)。一個(gè)QState對象可以有子狀態(tài),也可以有轉(zhuǎn)向其他狀態(tài)的轉(zhuǎn)換。狀態(tài)的ChildMode屬性用來設(shè)置子狀態(tài)之間的關(guān)系。屬性值有ExclusiveStates和ParallelStates,若為ExclusiveStates,表示子狀態(tài)之間是互斥的,必須調(diào)用setInitialState()函數(shù)設(shè)置初始狀態(tài),當(dāng)轉(zhuǎn)換的目標(biāo)是父狀態(tài)時(shí),狀態(tài)機(jī)還需知道要轉(zhuǎn)換到哪個(gè)子狀態(tài)中。若值為ParallelStates,各個(gè)子狀態(tài)之間是平行的關(guān)系,當(dāng)父狀態(tài)進(jìn)入到一個(gè)狀態(tài),所有的子狀態(tài)都進(jìn)入到這一狀態(tài),當(dāng)進(jìn)入到一個(gè)最終子狀態(tài)時(shí),狀態(tài)發(fā)出finished()信號[9]。

一個(gè)狀態(tài)機(jī)的狀態(tài)圖如圖1所示,s1,s2和s3分別表示狀態(tài)機(jī)的3個(gè)狀態(tài),黑點(diǎn)指示的狀態(tài)s1為初始狀態(tài),當(dāng)接收到button.clicked信號,即用戶點(diǎn)擊按鈕時(shí),狀態(tài)發(fā)生轉(zhuǎn)換,并在這3個(gè)狀態(tài)中循環(huán)切換。

2.2 QStateMachine類

QStateMachine類建立在狀態(tài)圖概念的基礎(chǔ)上,提供了一個(gè)分層的有限狀態(tài)機(jī)。狀態(tài)機(jī)體系的整體繼承關(guān)系主要分為3部分,分別是:

(1)負(fù)責(zé)存儲狀態(tài)的QAbstractState接口;

(2)負(fù)責(zé)對信號進(jìn)行處理的QAbstractTransition接口;

(3)為狀態(tài)機(jī)類提供信號事件的QEvent接口。

狀態(tài)機(jī)管理一組繼承自QAbstractState類的狀態(tài)和繼承自QAbstractTransition類的轉(zhuǎn)換,這些狀態(tài)和轉(zhuǎn)換確定一個(gè)狀態(tài)圖。狀態(tài)圖建立后,狀態(tài)機(jī)即可執(zhí)行它。

為狀態(tài)機(jī)添加狀態(tài)使用addState()函數(shù),移除狀態(tài)使用removeState()函數(shù)。重載onEntry()和onExit()函數(shù)可以使?fàn)顟B(tài)機(jī)在進(jìn)入或退出某狀態(tài)時(shí)進(jìn)行指定的操作。

2.3 轉(zhuǎn)換(Transition)

由一個(gè)狀態(tài)到另一個(gè)狀態(tài)變更的這一動作稱為轉(zhuǎn)換,每個(gè)狀態(tài)都包含一個(gè)轉(zhuǎn)換的集合。轉(zhuǎn)換定義了如何對事件(Events)進(jìn)行響應(yīng),Qt的信號和事件都可以觸發(fā)轉(zhuǎn)換。

轉(zhuǎn)換本身也可以包含動作,在轉(zhuǎn)換的過程中,狀態(tài)機(jī)能夠執(zhí)行一些動作(Action)。例如,當(dāng)進(jìn)入某個(gè)狀態(tài)時(shí),狀態(tài)機(jī)執(zhí)行onentry 動作;當(dāng)退出某個(gè)狀態(tài)時(shí),執(zhí)行onexit動作。假設(shè)當(dāng)狀態(tài)機(jī)通過一個(gè)名為T的轉(zhuǎn)換從狀態(tài)S1轉(zhuǎn)換到S2時(shí),它先執(zhí)行S1的 onexit動作,然后執(zhí)行T本身所包含的動作,最后執(zhí)行S2 的onentry動作。

addTransition()函數(shù)用來添加轉(zhuǎn)換,添加的轉(zhuǎn)換有3種情況。可以轉(zhuǎn)換到另一個(gè)轉(zhuǎn)換;可以是一個(gè)對象等待到一個(gè)信號后轉(zhuǎn)換到目標(biāo)狀態(tài);也可以無條件轉(zhuǎn)到目標(biāo)狀態(tài)。removeTransition()函數(shù)用來移除一個(gè)轉(zhuǎn)換。assignProperty()函數(shù)用來設(shè)置狀態(tài)的屬性。addDefaultAnimation()函數(shù)可以添加轉(zhuǎn)換時(shí)的動態(tài)效果。postEvent() 函數(shù)可以為狀態(tài)機(jī)設(shè)置優(yōu)先級。

在任何時(shí)刻,狀態(tài)機(jī)總處于一個(gè)狀態(tài)中,這個(gè)狀態(tài)被稱為主動態(tài)。當(dāng)某一事件發(fā)生時(shí),狀態(tài)機(jī)將檢查主動態(tài)包含的所有轉(zhuǎn)換,如果發(fā)現(xiàn)有一個(gè)和該事件匹配,狀態(tài)機(jī)將從當(dāng)前的主動態(tài)轉(zhuǎn)移到該轉(zhuǎn)換指定的目標(biāo)態(tài),即完成狀態(tài)的轉(zhuǎn)換;若找不到和該事件匹配的轉(zhuǎn)換,則狀態(tài)不發(fā)生變化。

3 狀態(tài)轉(zhuǎn)換機(jī)的多種狀態(tài)

3.1 歷史狀態(tài)(History States)

歷史狀態(tài)是一個(gè)虛擬狀態(tài),同時(shí)也是一個(gè)子狀態(tài),它的父狀態(tài)是最后一次退出時(shí)的那個(gè)父狀態(tài)。歷史狀態(tài)用來記錄當(dāng)前狀態(tài),當(dāng)狀態(tài)機(jī)發(fā)現(xiàn)運(yùn)行中有歷史狀態(tài)出現(xiàn)時(shí),則當(dāng)退出父狀態(tài)時(shí)它會自動地記錄當(dāng)前子狀態(tài)。一個(gè)轉(zhuǎn)向歷史狀態(tài)的轉(zhuǎn)換實(shí)際上是一個(gè)轉(zhuǎn)向狀態(tài)機(jī)之前存儲的子狀態(tài)的轉(zhuǎn)換,狀態(tài)機(jī)自動地轉(zhuǎn)向該子狀態(tài)。在中斷機(jī)制中應(yīng)用歷史狀態(tài)可以使?fàn)顟B(tài)轉(zhuǎn)換過程變得非常簡單。圖2所示的狀態(tài)機(jī)通過添加歷史狀態(tài),使?fàn)顟B(tài)機(jī)在中斷事件完成后仍然返回到發(fā)生中斷之前所處的那個(gè)子狀態(tài)。

關(guān)鍵代碼如下:

QHistoryState *s1h = new QHistoryState(s1);

QState *s3 = new QState();

s1?>addTransition(interruptButton, SIGNAL(clicked()), s3);

s3?>addTransition(s1h);

首先添加一個(gè)以s1狀態(tài)為父狀態(tài)的QHistoryState類的子狀態(tài)s1h和一個(gè)頂層狀態(tài)s3,再添加一個(gè)中斷按鈕,然后添加由s1向s3的轉(zhuǎn)換,點(diǎn)擊中斷按鈕則發(fā)生轉(zhuǎn)換,最后添加一個(gè)由s3向s1h的轉(zhuǎn)換。在 s1狀態(tài)的任何子狀態(tài)均可發(fā)生中斷,發(fā)生中斷后則將當(dāng)前子狀態(tài)記錄在s1h歷史狀態(tài)中,并進(jìn)入到s3狀態(tài),然后從s3狀態(tài)返回到s1h狀態(tài),即中斷前所處的那個(gè)子狀態(tài)。

3.2 復(fù)合狀態(tài)(Compound States)

一個(gè)狀態(tài)可以嵌套其他的狀態(tài),這樣的狀態(tài)稱為復(fù)合狀態(tài)。嵌套其他狀態(tài)的狀態(tài)稱為父狀態(tài)(parent state),而被嵌套的則稱為子狀態(tài)(child state)。子狀態(tài)又可以嵌套其他的狀態(tài),直到任意深度。不包含任何子狀態(tài)的狀態(tài),稱為原子狀態(tài)(atomic state)。

當(dāng)一個(gè)子狀態(tài)處于主動態(tài)(acitve)時(shí),它的父狀態(tài)也必須處于主動態(tài)。這樣一來,在任何一點(diǎn)我們都將擁有一個(gè)包含原子狀態(tài)和它所有祖先的主動態(tài)的集合。

由于復(fù)合狀態(tài)的存在,轉(zhuǎn)換(transition)不再是從一個(gè)原子狀態(tài)轉(zhuǎn)到另一個(gè)原子狀態(tài),而是從一個(gè)主動態(tài)集合轉(zhuǎn)到另一個(gè)主動態(tài)集合的轉(zhuǎn)換。如果狀態(tài)轉(zhuǎn)換的目標(biāo)是一個(gè)原子狀態(tài),那么狀態(tài)機(jī)將不僅進(jìn)入到該原子狀態(tài),而且還將進(jìn)入到它所有的處于活動狀態(tài)的祖先狀態(tài)中。如果轉(zhuǎn)換的目標(biāo)是一個(gè)復(fù)合狀態(tài),那么復(fù)合狀態(tài)的子狀態(tài)必須也被激活,由于轉(zhuǎn)換并沒有指定哪一個(gè)子狀態(tài),這時(shí)需要激活該復(fù)合狀態(tài)的初始子狀態(tài)。如果該狀態(tài)依然是復(fù)合狀態(tài),則遞歸下去,直到原子狀態(tài)為止。

復(fù)合狀態(tài)會影響到轉(zhuǎn)換的選擇。當(dāng)事件發(fā)生時(shí),狀態(tài)機(jī)從最深層嵌套的原子狀態(tài)開始查找,如果未找到匹配的轉(zhuǎn)換,則查找其父狀態(tài)的轉(zhuǎn)換,依次遞歸。如果狀態(tài)機(jī)中所有轉(zhuǎn)換均不匹配,事件被丟棄。

應(yīng)用復(fù)合狀態(tài)建立一個(gè)狀態(tài)組,則可以通過為父狀態(tài)應(yīng)用轉(zhuǎn)換使整個(gè)組的所有子狀態(tài)都共享該轉(zhuǎn)換,簡化了為每個(gè)子狀態(tài)都應(yīng)用轉(zhuǎn)換這一過程。

最終狀態(tài)(Final State)和歷史狀態(tài)(History State)可以作為一個(gè)復(fù)合狀態(tài)的子狀態(tài)。

3.3 平行狀態(tài)(Parallel States)

在狀態(tài)機(jī)體系中,平行狀態(tài)采用交叉存取方法,所有的平行操作以單一的、原子的事件處理方式執(zhí)行,因此沒有事件可以中斷平行狀態(tài)的操作。不過,事件仍然可以被順序執(zhí)行,因?yàn)闋顟B(tài)機(jī)本身是單線程的。假設(shè)有兩個(gè)轉(zhuǎn)換,都是退出同一個(gè)平行狀態(tài)組,使它們發(fā)生的條件同時(shí)為真。這時(shí),最后被處理的事件不會生效,因?yàn)榈谝粋€(gè)事件已經(jīng)使?fàn)顟B(tài)機(jī)從平行狀態(tài)組退出了。

如果在狀態(tài)機(jī)中所有狀態(tài)都是互斥的,那么這些狀態(tài)將擁有多種組合和轉(zhuǎn)換。特別的,使用平行狀態(tài)時(shí),當(dāng)增加一個(gè)狀態(tài)后,組合狀態(tài)和轉(zhuǎn)換的數(shù)量將會以線性方式增加,避免了指數(shù)級的劇增方式。而且增加或刪除狀態(tài)也不會影響到其他狀態(tài)。

建立平行狀態(tài)的代碼如下:

QState *s1 = new QState (QState::ParallelStates);

QState *s11 = new QState(s1);

QState *s12 = new QState(s1);

ParallelStates屬性表明建立的s1是一個(gè)平行狀態(tài)組,s1的子狀態(tài)s11和s12是平行關(guān)系。 當(dāng)進(jìn)入到一個(gè)平行狀態(tài)組時(shí),也就同時(shí)進(jìn)入了它所有的子狀態(tài)。單個(gè)子狀態(tài)轉(zhuǎn)換正常,且可以應(yīng)用一個(gè)退出父狀態(tài)的轉(zhuǎn)換。若退出父狀態(tài)的轉(zhuǎn)換發(fā)生,則同時(shí)退出父狀態(tài)和它所有的子狀態(tài)。

平行狀態(tài)與復(fù)合狀態(tài)差別很大,當(dāng)復(fù)合狀態(tài)處于主動態(tài)時(shí),有且只有一個(gè)子狀態(tài)處于主動態(tài);而當(dāng)平行狀態(tài)處于主動態(tài)時(shí),所有的子狀態(tài)都必須處于主動態(tài)。

3.4 錯(cuò)誤狀態(tài)(Error States)

如果遇到錯(cuò)誤,狀態(tài)機(jī)不會因?yàn)檫M(jìn)入錯(cuò)誤狀態(tài)而停止運(yùn)行,而會尋找錯(cuò)誤狀態(tài),一旦找到,即進(jìn)入這個(gè)狀態(tài),并可通過error()函數(shù)得到錯(cuò)誤類型,Error枚舉類型給出可能的錯(cuò)誤類型。如果處在正確的狀態(tài)申請錯(cuò)誤狀態(tài)類型,狀態(tài)機(jī)則停止執(zhí)行,并將錯(cuò)誤信息輸出至控制臺[10]。

4 狀態(tài)轉(zhuǎn)換機(jī)的啟動與終止

使用start()函數(shù)啟動狀態(tài)機(jī)。狀態(tài)機(jī)啟動前,必須設(shè)置初始狀態(tài),即啟動狀態(tài)機(jī)時(shí)狀態(tài)機(jī)進(jìn)入的那個(gè)狀態(tài)。狀態(tài)機(jī)進(jìn)入到初始狀態(tài)后,即發(fā)射started()信號。

狀態(tài)機(jī)是事件驅(qū)動的,它保持著自己的事件循環(huán),事件通過postEvent()函數(shù)傳給狀態(tài)機(jī),并異步執(zhí)行,如果沒有一個(gè)運(yùn)行中的事件循環(huán)它將不再向前推進(jìn)。不必像轉(zhuǎn)換函數(shù)一樣直接把事件傳給狀態(tài)機(jī),比如QEventTransition類和它的子類會處理。但是對由事件觸發(fā)的自定義的轉(zhuǎn)換來說,postEvent()是非常有用的。

狀態(tài)機(jī)不斷地處理事件和轉(zhuǎn)換,直到進(jìn)入到頂層的最終狀態(tài),此時(shí)狀態(tài)機(jī)發(fā)射finished()信號。也可以使用stop()函數(shù)終止?fàn)顟B(tài)機(jī),此時(shí)狀態(tài)機(jī)發(fā)射stopped()信號。

5 結(jié) 語

Qt作為一個(gè)通用的跨平臺C++類庫,其程序代碼無需修改或做較少改動便能夠在多種不同的操作系統(tǒng)下順利編譯并生成相對應(yīng)的軟件,為跨平臺軟件的開發(fā)提供了極佳的工作平臺。

應(yīng)用Qt狀態(tài)機(jī)事先設(shè)定若干狀態(tài)和狀態(tài)的轉(zhuǎn)換方式,使用戶在進(jìn)行了特定的操作后即轉(zhuǎn)換到指定的狀態(tài),并執(zhí)行指定的動作,從而實(shí)現(xiàn)按流程操作的功能。交互式應(yīng)用程序中,用戶的一些鼠標(biāo)操作需按步驟進(jìn)行,研發(fā)表明,使用Qt狀態(tài)機(jī)能夠使編程更為簡便和高效。在開發(fā)動畫應(yīng)用程序時(shí),應(yīng)用Qt狀態(tài)機(jī)也能夠發(fā)揮很大的作用。

參考文獻(xiàn)

[1] 王愛文.Linux平臺下基于Qt的電子海圖的研究與實(shí)現(xiàn)[D].哈爾濱:哈爾濱工程大學(xué),2004.

[2] 鄧飛.基于Qt的地震資料采集質(zhì)量監(jiān)控及評價(jià)系統(tǒng)的開發(fā)與研究[D].成都:成都理工大學(xué),2004.

[3] 許德新,談?wù)穹哐訛I.基于Qt組件庫應(yīng)用程序的生成及其跨平臺實(shí)現(xiàn)[J].東北農(nóng)業(yè)大學(xué)學(xué)報(bào),2006,37(3):373?376.

[4] 楊少鵬.SXD/Linux通信編碼仿真平臺的設(shè)計(jì)與實(shí)現(xiàn)[D].成都:西南交通大學(xué),2005.

[5] 蔡志明.精通Qt4編程[M].2版.北京:電子工業(yè)出版社,2011.

[6] 李艷民.基于Qt跨平臺的人機(jī)交互界面的研究和應(yīng)用[D].重慶:重慶大學(xué),2007.

[7] 鄭阿奇.Qt4開發(fā)實(shí)踐[M].北京:電子工業(yè)出版社,2011.

[8] 聶旭中.狀態(tài)機(jī)設(shè)計(jì)研究[J].洛陽師范學(xué)院學(xué)報(bào),2009(3):62?65.

[9] 齊亮.C++ GUI Qt 3編程[M].北京:北京航空航天大學(xué)出版社,2006.

主站蜘蛛池模板: 一级毛片免费观看久| 久久人与动人物A级毛片| 国产青青草视频| 久久亚洲国产视频| 黄色网站在线观看无码| 午夜不卡视频| 亚洲成人网在线播放| 日韩欧美成人高清在线观看| 亚洲精品无码高潮喷水A| 麻豆国产在线不卡一区二区| 午夜老司机永久免费看片| 欧洲高清无码在线| 在线看国产精品| 亚洲性日韩精品一区二区| 国产欧美日韩va另类在线播放| 综合人妻久久一区二区精品 | 久久青草视频| 在线人成精品免费视频| 国产黄视频网站| 午夜福利免费视频| 福利小视频在线播放| 91久久精品日日躁夜夜躁欧美| 亚洲香蕉久久| 国产麻豆另类AV| 亚洲成a人片在线观看88| 97精品久久久大香线焦| 999精品在线视频| 亚洲一区二区约美女探花| 91区国产福利在线观看午夜 | 日韩毛片在线视频| 在线观看国产网址你懂的| 日韩免费毛片视频| 99久久国产综合精品2023| 欧洲高清无码在线| 日本一区二区三区精品国产| 91亚洲影院| 99热最新网址| 欧美日韩综合网| 国产高清又黄又嫩的免费视频网站| 欧美性精品| 久久综合结合久久狠狠狠97色| 国产内射在线观看| 免费可以看的无遮挡av无码| 欧美日韩动态图| 国产精品成人免费视频99| 中文字幕久久精品波多野结| 欧美精品亚洲精品日韩专区| 无码日韩人妻精品久久蜜桃| 婷婷六月色| 国产精品夜夜嗨视频免费视频| 91av成人日本不卡三区| 无码视频国产精品一区二区| 国产精品网址在线观看你懂的| 欧美69视频在线| 国产无码网站在线观看| 72种姿势欧美久久久久大黄蕉| 亚洲国产成人麻豆精品| a在线观看免费| 国产无码网站在线观看| 色综合久久综合网| 精品福利网| 激情国产精品一区| 一区二区三区高清视频国产女人| 精品国产乱码久久久久久一区二区| 毛片免费试看| 欧美日韩一区二区三| 免费女人18毛片a级毛片视频| 一本大道无码日韩精品影视| 青青青伊人色综合久久| 日韩高清中文字幕| 久一在线视频| 国产成人精品日本亚洲77美色| 91精品国产一区自在线拍| 日本91在线| 欧美色图第一页| 狠狠操夜夜爽| 黄色网页在线观看| 午夜激情福利视频| 欧洲精品视频在线观看| 2020极品精品国产| 日韩精品无码免费一区二区三区| 天天躁狠狠躁|