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

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

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

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


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

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

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

一旦連接建立,就可以通過QSqlQueryModel類對數據庫進行查詢操作,QSqlQueryModel類提供了一個只讀的數據模型用來表示SQL操作的結果,如下:
QSqlQueryModel model;
model.setQuery(quot;SELECT* FROM EarthquakeDataquot;)
查詢提交后就可以使用model的record(i)成員函數訪問第i條結果了。
QSqlQueryModel和QSqlTableModel提供從數據庫數據到用于數據表示的窗體的映射,這些類均以QT的model/view結構設計,實現地震資料數據庫查詢結果的顯示輸出。數據庫管理模塊采用3層架構方式來將用戶界面、業務邏輯、數據訪問分離開來,而它們彼此間則通過接口交互。在這種架構下,用戶通過中間層來訪問和修改數據庫,這樣有利于保持數據的一致性和正確性。由于用戶不直接訪問數據庫,數據庫結構的改變不會引起用戶服務程序的修改,而只需修改中間層。
本文所提出的地震數據處理系統為高速鐵路地震預警系統的穩定性及可擴展性提供了一定的保障。Qt工具庫面向對象特性和可視化編程技術的充分結合利用使系統具備了擴充性和可靠性。代碼也很容易跨平臺移植,以適應用戶的特殊要求。同時,開源的第三方庫Qwt的應用,則可幫助我們利用他人已有的成果進一步降低開發難度,提高開發效率。另外由于該系統采用數據庫方式處理地震資料,也大大減少了原有系統數據維護的工作量及繁雜度。
1 Jasmin Blanchette&Mark Summerfield.C++GUI Programming with Qt4 2nd Edition[S].2008.
2 萬長勝,等.用Q t進行面向對象軟件的設計與開發[J].核電子學與探測技術,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].北京:電子工業出版社,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年生,碩士,研究方向:程序設計,面向對象開發.E-mail:cybersyf@qq.com
TH76.3
A