使用Qt库开发地震数据处理系统的分析与设计*
2011-11-14孙一帆郭唐永
孙一帆 郭唐永 邹 彤 朱 威
(中国地震局地震研究所,武汉 430071)
使用Qt库开发地震数据处理系统的分析与设计*
孙一帆 郭唐永 邹 彤 朱 威
(中国地震局地震研究所,武汉 430071)
提出一种运用Qt开发库和三方库Qwt对地震数据处理系统进行设计完善的方案,此方案基于面向对象思想,编程简便、容易维护、硬件兼容性好、可移植性强。
Qt;Qwt;信号和槽;面向对象;数据处理
1 引言
高速铁路地震预警系统在高速铁路轨道沿线的多个地震监测点布设传感器,连续不断地采集、监测地震动。一旦检测到发生的地震有可能危及列车运行安全时,进行应急处置,降低地震造成的损害。地震数据处理系统是作为高速铁路地震预警系统的一个子系统,为铁路管理人员和地震工程人员提供高效的数据处理解决方案。系统包括用户界面、数据图形化显示、数据管理等多个子系统。各种地震数据处理软件均配备了完善的用户交互子系统的主框架设计。因为整个系统实时性、运行稳定性,以及跨平台和可扩展性的要求,所以采用基于C++语言的Qt开发库来设计地震数据处理系统,实现地震数据的可视化管理。
2 相关技术分析
作为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首选。
2.1 signal/slot机制
要了解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完全独立于任何事件循环。
2.2 model/view结构
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
2.3 Qwt
Qwt(Qt Widgets for Technical Applications)是一个基于LGPL版权协议的开源项目,可为科学数据生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据,数据源以数值、数组或浮点数组等方式提供,输出方式可以是 Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等[4]。该工具库基于Qt开发,所以也继承了Qt的跨平台特性。
3 地震数据处理系统概述
地震数据处理主系统是一种综合性数据业务系统,包括用户界面、数据图形化显示、数据管理等多个子系统。随着数据处理解释一体化系统的发展,系统应该具有统一的数据管理平台、统一的显示界面和统一的作业平台。而利用Qt库强大的GUI设计统一的用户界面正是为处理系统的系统管理功能和处理应用功能提供了一种可视化的手段,其中实现了用户管理、项目管理、数据管理和流程管理的“高内聚”主控功能;而通过Qt的信号和槽机制来调用独立的功能模块,使系统各个模块之间又具“低耦合”的特点,最大程度地提高系统的效率[5]。
3.1 体系结构设计
选择合适的体系结构,对于软件开发者而言是最重要的事项。良好的体系结构可以降低软件系统的复杂性,各个模块更能够符合“低耦合高内聚”的要求,使系统具备良好的可重用性。
图3 地震数据处理系统总体结构Fig 3 Overall structure of seisemetic data process system
用户主控制界面。为系统提供统一风格的窗体结构,要求界面直观清楚,操作方便,具有商业软件界面特征。使用Qt的可视化编程方式设计出界面(.UI文件),利用signal/slot将界面各控件与后台任务逻辑关联起来。
3.2 地震数据图形化显示模块
提供实时监控功能。传感器获得的地震信息通过A/D转换,由I/O接口传送给主机,显示模块把这些数据通过图形化表示实时显示给用户,并可提供传感器实时运行的状态信息。图形化显示模块主要是利用Qwt工具库构建的,使用Qwt提供的Qwt-PlotCurve类完成地震波形曲线的绘制。
下面是曲线类的关键代码:
replot();//每经过一定的时间间隔图形坐标发生平移,图像需要重绘,时间间隔由*QTimerEvent类型的参数决定,此处使用默认值1 000毫秒刷新一次
3.3 数据管理模块
数据访问接口的实现主要依赖于两个核心的类,一个是自定义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层架构方式来将用户界面、业务逻辑、数据访问分离开来,而它们彼此间则通过接口交互。在这种架构下,用户通过中间层来访问和修改数据库,这样有利于保持数据的一致性和正确性。由于用户不直接访问数据库,数据库结构的改变不会引起用户服务程序的修改,而只需修改中间层。
4 结束语
本文所提出的地震数据处理系统为高速铁路地震预警系统的稳定性及可扩展性提供了一定的保障。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