孫一帆 郭唐永 鄒 彤 朱 威
(中國地震局地震研究所,武漢 430071)
使用Qt庫開發(fā)地震數(shù)據(jù)處理系統(tǒng)的分析與設(shè)計*
孫一帆 郭唐永 鄒 彤 朱 威
(中國地震局地震研究所,武漢 430071)
提出一種運用Qt開發(fā)庫和三方庫Qwt對地震數(shù)據(jù)處理系統(tǒng)進行設(shè)計完善的方案,此方案基于面向?qū)ο笏枷耄幊毯啽恪⑷菀拙S護、硬件兼容性好、可移植性強。
Qt;Qwt;信號和槽;面向?qū)ο?數(shù)據(jù)處理
高速鐵路地震預(yù)警系統(tǒng)在高速鐵路軌道沿線的多個地震監(jiān)測點布設(shè)傳感器,連續(xù)不斷地采集、監(jiān)測地震動。一旦檢測到發(fā)生的地震有可能危及列車運行安全時,進行應(yīng)急處置,降低地震造成的損害。地震數(shù)據(jù)處理系統(tǒng)是作為高速鐵路地震預(yù)警系統(tǒng)的一個子系統(tǒng),為鐵路管理人員和地震工程人員提供高效的數(shù)據(jù)處理解決方案。系統(tǒng)包括用戶界面、數(shù)據(jù)圖形化顯示、數(shù)據(jù)管理等多個子系統(tǒng)。各種地震數(shù)據(jù)處理軟件均配備了完善的用戶交互子系統(tǒng)的主框架設(shè)計。因為整個系統(tǒng)實時性、運行穩(wěn)定性,以及跨平臺和可擴展性的要求,所以采用基于C++語言的Qt開發(fā)庫來設(shè)計地震數(shù)據(jù)處理系統(tǒng),實現(xiàn)地震數(shù)據(jù)的可視化管理。
作為TrollTech公司的標志產(chǎn)品,Qt是一個跨平臺的C++GUI(圖形用戶界面)應(yīng)用構(gòu)架,它提供了豐富的窗口部件集,具有面向?qū)ο蟆⒁子跀U展、跨平臺等特點,目前Linux上最為流行的KDE桌面環(huán)境以及虛擬地球儀軟件GoogleEarth就是建立在 Qt庫的基礎(chǔ)上。Qt支持幾乎所有主流操作系統(tǒng):MSWindows、UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX;QtEmbedded則支持采用framebuffer接口 的 Linux平臺。良好的可移植性使得Qt成為跨平臺上進行軟件開發(fā)時的GUI首選。
要了解Qt就必須首先認識signal/slot(信號和槽)機制。信號和槽是一種高級接口,應(yīng)用于對象之間的通信,它是Qt的核心特性,也是Qt區(qū)別于其他開發(fā)庫的重要地方。信號和槽是Qt自行定義的一種通信機制,它獨立于標準的C/C++語言,因此要正確的處理信號和槽,必須借助一個稱為moc (Meta Object Compiler)的工具,該工具是一個 C+ +預(yù)處理程序,它為把含有Qt特有語法的代碼自動轉(zhuǎn)化生成標準C++語言代碼,供C++編譯器下一步處理[1]。在我們所熟知的許多其他 GUI開發(fā)包中,窗口部件(widget)都有一個回調(diào)函數(shù)用于響應(yīng)它們所觸發(fā)的每個動作,這個回調(diào)函數(shù)通常是一個指向某個函數(shù)的指針。但是,在Qt中信號和槽取代了這些凌亂的函數(shù)指針,使得編寫這些窗口部件響應(yīng)程序更為簡潔明了。信號和槽能攜帶任意數(shù)量和任意類型的參數(shù),其類型完全安全,不會像回調(diào)函數(shù)那樣產(chǎn)生運行錯誤。
信號是一個特定的標識,而槽就是一個函數(shù),槽函數(shù)既可與信號關(guān)聯(lián),也能夠像普通函數(shù)一樣被調(diào)用,如圖1所示,當Object1對象的某個特定事件發(fā)生時,通過發(fā)送信號,將與之相關(guān)聯(lián)的Object2對象的槽函數(shù)激活,即執(zhí)行槽函數(shù)的代碼,在程序中使用QObject::connect()將某個信號和某個槽進行關(guān)聯(lián)。

圖1 信號和槽機制Fig 1 Signal and slot mechanism
所有從QObject或其子類(如Qwidget)派生的類都能夠包含信號和槽。當對象改變其狀態(tài)時,信號就由該對象發(fā)射(emit)出去,它不關(guān)心另一端是誰在接收這個信號。一個槽也并不關(guān)心是否有信號與自己相連接。signal/slot實現(xiàn)了高度的信息封裝,它確保對象被當作一個真正的軟件組件來使用[2]。signal/slot降低了Qt對象的耦合度,即使關(guān)聯(lián)的對象在運行時被刪除,應(yīng)用程序也不會崩潰,因此設(shè)計出來的組件可重用性較高。signal/slot完全獨立于任何事件循環(huán)。
Qt包含大量item view類,它們使用model/view (模型/視圖)結(jié)構(gòu)來管理數(shù)據(jù)與表示層的關(guān)系。該結(jié)構(gòu)與經(jīng)典的MVC設(shè)計模式基于同樣的思想,即將數(shù)據(jù)存儲與數(shù)據(jù)表示進行分離[3]。這種功能上的分離給了開發(fā)人員更大的彈性來定制數(shù)據(jù)項的表示,它也提供一個標準的model接口,使得更多的數(shù)據(jù)源可以被這些item view類使用。
如圖2所示,model與數(shù)據(jù)源通訊,并提供接口供其他組件使用。通訊的性質(zhì)依賴于數(shù)據(jù)源的種類與model實現(xiàn)的方式。view從model獲取model indexes,后者是數(shù)據(jù)項的引用。通過把model indexes提供給model,view可以從數(shù)據(jù)源中獲取數(shù)據(jù)。
在標準的views中,delegate會對數(shù)據(jù)項進行渲染,當某個數(shù)據(jù)項被選中時,delegate通過model indexes與model直接進行交流。總的來說,model/ view相關(guān)類可以被分成上面所提到的3組:models,views,delegates。這些組件通過抽象類來定義,它們提供了共同的接口,在某些情況下,還提供了缺省的實現(xiàn)。抽象類意味著需要子類化以提供完整的其他組件希望的功能,同時也允許實現(xiàn)定制的組件。models、views、delegates之間通過signal/slot機制來進行通訊:從model發(fā)出的信號通知view數(shù)據(jù)源中的數(shù)據(jù)發(fā)生了改變;從view發(fā)出的信號提供了有關(guān)被顯示的數(shù)據(jù)項與用戶交互的信息;從delegate發(fā)生的信號被用于在編輯時通知model和view關(guān)于當前編輯器的狀態(tài)信息。

圖2 模型/視圖結(jié)構(gòu)Fig 2 Model/view architecture
Qwt(Qt Widgets for Technical Applications)是一個基于LGPL版權(quán)協(xié)議的開源項目,可為科學(xué)數(shù)據(jù)生成各種統(tǒng)計圖。它為具有技術(shù)專業(yè)背景的程序提供GUI組件和一組實用類,其目標是以基于2D方式的窗體部件來顯示數(shù)據(jù),數(shù)據(jù)源以數(shù)值、數(shù)組或浮點數(shù)組等方式提供,輸出方式可以是 Curves(曲線),Slider(滾動條),Dials(圓盤),Compasses(儀表盤)等[4]。該工具庫基于Qt開發(fā),所以也繼承了Qt的跨平臺特性。
地震數(shù)據(jù)處理主系統(tǒng)是一種綜合性數(shù)據(jù)業(yè)務(wù)系統(tǒng),包括用戶界面、數(shù)據(jù)圖形化顯示、數(shù)據(jù)管理等多個子系統(tǒng)。隨著數(shù)據(jù)處理解釋一體化系統(tǒng)的發(fā)展,系統(tǒng)應(yīng)該具有統(tǒng)一的數(shù)據(jù)管理平臺、統(tǒng)一的顯示界面和統(tǒng)一的作業(yè)平臺。而利用Qt庫強大的GUI設(shè)計統(tǒng)一的用戶界面正是為處理系統(tǒng)的系統(tǒng)管理功能和處理應(yīng)用功能提供了一種可視化的手段,其中實現(xiàn)了用戶管理、項目管理、數(shù)據(jù)管理和流程管理的“高內(nèi)聚”主控功能;而通過Qt的信號和槽機制來調(diào)用獨立的功能模塊,使系統(tǒng)各個模塊之間又具“低耦合”的特點,最大程度地提高系統(tǒng)的效率[5]。
選擇合適的體系結(jié)構(gòu),對于軟件開發(fā)者而言是最重要的事項。良好的體系結(jié)構(gòu)可以降低軟件系統(tǒng)的復(fù)雜性,各個模塊更能夠符合“低耦合高內(nèi)聚”的要求,使系統(tǒng)具備良好的可重用性。

圖3 地震數(shù)據(jù)處理系統(tǒng)總體結(jié)構(gòu)Fig 3 Overall structure of seisemetic data process system
用戶主控制界面。為系統(tǒng)提供統(tǒng)一風(fēng)格的窗體結(jié)構(gòu),要求界面直觀清楚,操作方便,具有商業(yè)軟件界面特征。使用Qt的可視化編程方式設(shè)計出界面(.UI文件),利用signal/slot將界面各控件與后臺任務(wù)邏輯關(guān)聯(lián)起來。
提供實時監(jiān)控功能。傳感器獲得的地震信息通過A/D轉(zhuǎn)換,由I/O接口傳送給主機,顯示模塊把這些數(shù)據(jù)通過圖形化表示實時顯示給用戶,并可提供傳感器實時運行的狀態(tài)信息。圖形化顯示模塊主要是利用Qwt工具庫構(gòu)建的,使用Qwt提供的Qwt-PlotCurve類完成地震波形曲線的繪制。
下面是曲線類的關(guān)鍵代碼:


replot();//每經(jīng)過一定的時間間隔圖形坐標發(fā)生平移,圖像需要重繪,時間間隔由*QTimerEvent類型的參數(shù)決定,此處使用默認值1 000毫秒刷新一次
數(shù)據(jù)訪問接口的實現(xiàn)主要依賴于兩個核心的類,一個是自定義DatabaseCFG類,一個是Qt提供的QSqlDatabase類。
DatabaseCFG類的主要的功能就是根據(jù)指定的數(shù)據(jù)庫配置文件,得到數(shù)據(jù)庫對象。它的使用示例代碼如下:

以上示例代碼完成了對地震資料數(shù)據(jù)庫的連接,并得到該數(shù)據(jù)庫對象,SqliteConfig.ini為連接開源SQLITE數(shù)據(jù)庫的配置文件。為了實現(xiàn)接口可以連接幾種數(shù)據(jù)庫,且又不需要修改源程序,我們定義一個數(shù)據(jù)庫連接配置文件,文件格式如下:

QSqlDatabase主要實現(xiàn)對數(shù)據(jù)庫的操作。系統(tǒng)采用數(shù)據(jù)庫方式管理地震資料,該模塊提供地震數(shù)據(jù)庫的查詢、修改,并可將查詢結(jié)果以圖形方式顯示。數(shù)據(jù)庫連接操作由Qt的QSqlDatabase類提供。
建立數(shù)據(jù)庫連接的代碼如下:

一旦連接建立,就可以通過QSqlQueryModel類對數(shù)據(jù)庫進行查詢操作,QSqlQueryModel類提供了一個只讀的數(shù)據(jù)模型用來表示SQL操作的結(jié)果,如下:
QSqlQueryModel model;
model.setQuery(quot;SELECT* FROM EarthquakeDataquot;)
查詢提交后就可以使用model的record(i)成員函數(shù)訪問第i條結(jié)果了。
QSqlQueryModel和QSqlTableModel提供從數(shù)據(jù)庫數(shù)據(jù)到用于數(shù)據(jù)表示的窗體的映射,這些類均以QT的model/view結(jié)構(gòu)設(shè)計,實現(xiàn)地震資料數(shù)據(jù)庫查詢結(jié)果的顯示輸出。數(shù)據(jù)庫管理模塊采用3層架構(gòu)方式來將用戶界面、業(yè)務(wù)邏輯、數(shù)據(jù)訪問分離開來,而它們彼此間則通過接口交互。在這種架構(gòu)下,用戶通過中間層來訪問和修改數(shù)據(jù)庫,這樣有利于保持數(shù)據(jù)的一致性和正確性。由于用戶不直接訪問數(shù)據(jù)庫,數(shù)據(jù)庫結(jié)構(gòu)的改變不會引起用戶服務(wù)程序的修改,而只需修改中間層。
本文所提出的地震數(shù)據(jù)處理系統(tǒng)為高速鐵路地震預(yù)警系統(tǒng)的穩(wěn)定性及可擴展性提供了一定的保障。Qt工具庫面向?qū)ο筇匦院涂梢暬幊碳夹g(shù)的充分結(jié)合利用使系統(tǒng)具備了擴充性和可靠性。代碼也很容易跨平臺移植,以適應(yīng)用戶的特殊要求。同時,開源的第三方庫Qwt的應(yīng)用,則可幫助我們利用他人已有的成果進一步降低開發(fā)難度,提高開發(fā)效率。另外由于該系統(tǒng)采用數(shù)據(jù)庫方式處理地震資料,也大大減少了原有系統(tǒng)數(shù)據(jù)維護的工作量及繁雜度。
1 Jasmin Blanchette&Mark Summerfield.C++GUI Programming with Qt4 2nd Edition[S].2008.
2 萬長勝,等.用Q t進行面向?qū)ο筌浖脑O(shè)計與開發(fā)[J].核電子學(xué)與探測技術(shù),2004,24:311.
3 Qt Reference Documentation http[DB/OL].http://doc.trolltech.com/4.6/index.html.
4 Qwt User’s Guide 6.0.0[DB/OL].http://qwt.sourceforge.net/classes.html.
5 蔡志明.精通 Qt4編程[M].北京:電子工業(yè)出版社,2008.
DEVELOPING SEISMIC DATA PROCESSING SYSTEM USING Qt LIBRARY
Sun Yifan,Guo Tangyong,Zou Tong and Zhu Wei
(Institute of Seismology,CEA,Wuhan 430071)
Seismic data processing system is an important part of earthquake early warning system for highspeed railway.This paper presents the use of Qt development libraries and Qwt library in the design of seismic data processing system.This design is based on object-oriented thinking,easier to program and convenient for maintaining and has better hardware compatibility and portability.
Qt;Qwt;signal/slot;object-oriented;data processing
1671-5942(2011)Supp.-0138-04
2011-02-25
孫一帆,男,1984年生,碩士,研究方向:程序設(shè)計,面向?qū)ο箝_發(fā).E-mail:cybersyf@qq.com
TH76.3
A