【VC++开源代码栏目提醒】:网学会员为广大网友收集整理了,【精品文档】-QT平台升级对于储层建模软件SGeMS影响的研究 - 综合课件,希望对大家有所帮助!
·32· 计算机与信息技术 软件纵横 QT平台升级对于储层建模软件 SGeMS影响的研究 赵智宝 张国梁 王家华 西安石油大学 计算机学院陕西 西安 710065 摘 要 SGeMS包含了绝大多数地质统计学算法其中包含多点统计建模的相关算法且提供了C语言编写的源
代码因此受到国内外从事油气储层建模的专业人士的广泛重视。
本文主旨在于针对QT平台由QT3升级QT4而造成的SGeMS软件不能进行编译、运行等问题而提出的一种解决方案。
该方案可以改动少量的源
代码实现SGeMS软件的平台转换。
关键词 SGeMS编译移植平台 1 引言 SGeMS是由斯坦福大学石油工程系编写的大型3D储层地质统计学建模软件。
SGeMS是一种基于设计模式采用各个模块之间的动态链接库DLL进行链接编写的软件。
它的设计思想、软件模块的组织方法以及编写的规范是值得思考和借鉴的。
采用这种方法可以提高模块内部的高内聚降低软件模块间的耦合度隐藏实现细节更利于软件的维护和升级1。
笔者依照SGeMS的设计模式软件实现的方法追根溯源提出因为QT平台升级而造成影响的一种解决方案。
SGeMS一共有12个模块。
该方案是基于分析SGeMS模块之间的依赖关系从最底层的GsTLAppli_utils公共模块进行QT平台的升级然后按照依赖GsTLAppli_utils模块的顺序升级其他各个模块各个模块之间的依赖关系如图1所示。
经笔者亲身体验这个方案可以有效地减少平台升级带来的工作量和改写源
代码的行数有助于理解SGeMS的体系结构、提高工作效率。
SGeMS是由多种
开源软件包协同工作的在升级的过程中环境配置的正确与否对升级的工作量影响很大。
错误的环境配置会导致许多意外的错误产生或者从理论上是不能够实现升级的。
图1 SGeMS模块间的依赖关系 软件纵横 计算机与信息技术 ·33· 2 SGeMS编译环境的搭建 SGeMS环境是由多种
开源软件包共同搭建起来的。
主要由SGeMS源码、Microsoft Visual Studio 2005、QT 4.2.3、Coin3d、SoQT、Python、GsTL、六种软件包共同搭建的2。
下面就如何具体搭建编译环境进行分析。
2.1 安装Microsoft Visual Studio 2005和QT 4.2.3 首先在本机安装Microsoft Visual Studio 2005中文版和英文版皆可安装完成以后安装QT 4.2.3首先在QT网站下载QT 4.2.3源码。
安装步骤如下 第一步首先解压缩QT 4.2.3的源
代码包到某个目录下这里使用的是commercial版本如DQt4.2.3。
然后在系统环境目录下添加一个QTDIRDQt4.2.3环境变量并且在系统的PATH追加 QTDIRbin目录项在系统中添加QMAKESPECwin32-msvc2005下追加以使得可以找到编译后的库和应用程序。
把VS 2005装在DProgram FilesMicrosoft Visual Studio 8 路径下若不一样请修改您自己的路径。
第二步拷贝license文件。
要安装商业版本就必须具有安装商业的license将.qt-license文件拷贝到用户的USERPROFILE目录下如CDocuments and SettingsAdministrator。
第三步运行vsvars32.bat来为
vc2005设定环境变量。
Dlibqt4.2.0DProgram FilesMicrosoft Visual Studio 8Common7Toolsvsvars32.bat 冒号很重要建议拷贝到命令窗口。
第四步在Dqt4.2.3 下运行configure -debug-and-release -no-stl -no-sql-sqlite -qt-libjpeg -qt-gif -platform win32-msvc2005。
第五步在Dqt4.2.3 nmake进行编译如果没有错则编译完成。
第六步在Microsoft Visual Studio 2005测试是否安装成功。
2.2 安装Coin3d、 SoQT以及Python 在网站www.coin3d.org 下载coin2.5.0 for Windows
vc 8.0 binaries 版本和SoQt-1.4.1解压缩直接可以使用。
如果想自己尝试编译的过程请参照网站提示进行编译。
在http//www.python.org 下载python-2.5版本双击按照提示安装到任意盘符下。
2.3 配置库寻找路径 安装好各个程序包以后需要在Microsoft Visual Studio 2005集成环境中配置QT、Python、Coin3d 以及SoQT库文件的查找路径。
具体方法如下打开Visual Studio 2005选择工具中的选项在项目和解决方案中的
VC中配置库文件的绝对路径如图2所示。
图2 库路径配置 3 QT 3到QT4的平台升级 SGeMS-1.4.1是在Microsoft Visual Studio 2003和QT3 平台上开发的。
现在最新的QT4版本是对QT3进行了调整和升级。
鉴于库文件改动较大以前使用QT3开发的软件在QT4平台上无法运行调试。
所以要对SGeMS进行平台的移植。
这样存在的困难在于 1 QT3和QT4在UI文件生成存在体制上的差异。
2 QT3和QT4在库类的构造上和库函数的使用存在·34· 计算机与信息技术 软件纵横 差异。
3 QT4取代了QT3一些类致使SGeMS中使用的QT3类在QT4根本查找不到这部分是比较难处理的。
针对以上问题结合实际处理提出一些的处理方法。
3.1 UI的处理 QT 3 的UI文件在QT 4中直接采用qmake编译工程文件是错误的。
因为它们之间在生成UI文件的.h文件存在着很大的差异。
一般在处理这种问题的方法是 1用QT 4中的include文件下的工具 Designer 打开保存为同名的UI文件。
2保存同名文件后采用 qmake projectqmake project t vcapp o testqmake test 的方法进行转换。
注意转换后的UI 文件在QT 4中也不能直接使用还得在源文件中进行修改。
因为QT 4 和QT 3 生成UI 文件在生成的文件名上不同。
QT 4生成的文件名在原文件名开头加以ui_加以标示例如ui_multichoice_dialog.h。
在包含该文件时应该修改头文件加上ui开头标示。
其次在继承该类的时候不应该单纯的继承本类还需继承QDialog 或者QWidget3这样可以保证ui文件中的setupUi成员函数能改正常使用。
最后在继承类实现的源文件.cpp中的构造函数加上setupUi成员函数这样可以使得继承类可以初始化界面并进行启动4。
3.2 库函数的处理 QT3和QT4在库类的构造上和库函数的使用存在巨大差异。
例如经常使用的QWiget在QT3中构造函数为QWidgetQWidget QWidget parent 0const char name 0WFlags f 0 然而在QT4为QWidgetQWidget QWidget parent 0QTWindowFlags f 0 。
所以在使用过程中要把name 形参去掉而且把WFlags 修改为QTWindowFlags否则编译器报错WFlags是无法识别的字符5。
这种方法仅仅是处理一些简单的构造问题。
如果同样的类库但是QT4 中缺少QT3的成员函数。
而在QT3 程序中又使用了该函数采用以上的方法是行不通的。
例如QT3 中 QPainter有这样的函数void setBackgroundColor const QColor c 而在 QT4中却没有。
解决这种的方法是查询QT4的帮助文件查找是否存在Q3Painter如果存在就把这个头文件包含进去即 include 。
这种方法的优点是能更好的兼容QT3减少更改
代码工作量6。
缺点是如果以后有更高的版本还需寻找解决的方法。
3.3 库类中的代替类 如果程序中使用的类在QT4库中根本没有怎么解决。
例如在SGEMS中使用了QWidgetFactory 类动态生成Ui界面而在QT 4中根本不存在QWidgetFactory类。
因此直接在QT 4使用QWidgetFactory编译器是报错的。
换种思路采用QT3Support Module还是找不到解决的办法。
那么现在只能在QT 4的帮助文档中寻找功能类似的而且参数类型类似的函数加以代替如果找不到这个办法也就失效了。
注意查询相似函数的过程是一个耐心而繁琐的工作。
通过查询QT 4帮助文档找到了在功能上和QWidgetFactory相似的两个类QUiLoader和QFormBuilder。
而其中load函数正是SGEMS使用的同义而不同名的函数。
QWidget QFormBuilderload QIODevice deviceQWidget parent 0 QWidget QUiLoaderload QIODevice deviceQWidget parentWidget 0 现在有两种代替QWidgetFactory的选择根据SGEMS上下文的使用采用QFormBuilder相对合适。
因为在其他地方SGEMS同样使用了QFormBuilder一个功能相近的成员函数7。
4 SGeMS汉化 目前SGeMS 的界面是英文的。
在汉化的工作上需要了解的是SGeMS的界面大体上分两部分 1框架界面程序的主窗口界面工具栏菜单条停靠工具三维显示等。
2动态生成界面各个算法的实现界面。
主窗口的界面在程序中是要参与编译过程的。
根据ui文件的特性每次程序编译都生成新的界面.h文件所以单纯的修改程序内部是不可行的。
在修改程序内部的同时要将界面的进行汉化。
而对于动态生成界面只需要将界面汉化即可程序内部不需要改动。
QT4 的Designer 工具支持在界面上直接汉化显示不会出现乱码的现象。
5 结论与不足 SGeMS编译、平台移植、汉化的过程是一个需要仔细和耐心的过程。
SGeMS开发与以往开发软件的形式不一样。
它采用了C、QT、Python、SoQT等不同的库文件而能将所有的库应用结合到一起形成一个统一的整体是很关键的。
在环境的搭建过程中可能出现各种各样的问题需要细心的寻找根源否则可能导致SGeMS的编译不成功或者部分功能不能使用。
在平台移植、汉化的过程中该方案采 下转第38页 ·38· 计算机与信息技术 软件纵横 SELECT 模拟次数 班级 科目 最低分 AS 数值类别 最低分 AS 数值 FROM 模拟成绩 建立的视图如图7所示 图7 模拟成绩视图 接下来新建一个数据集DataSet1.xsd建立数据源连接并把新建的视图“模拟成绩视图”拖进来然后创建报表文件注意选择“交叉表”向导类型下一步在“数据”选项窗口将视图加到右边框中点击“下一步”在交叉表向导中把班级、科目字段拖拽到行中把模拟次数、数值类别字段拖到列中把数值字段拖到汇总字段中点击完成右击报表选择“交叉表专家”勾选抑制行列总计这样就设计好了报表形式。
最后在窗体Load事件中写相关
代码 ‘连接和打开数据库
代码同上省去 Dim dajc As New Data.SqlClient.SqlDataAdapterselect from 模拟成绩视图 cn dajc.FilldsdataSet 模拟成绩视图 ‘填充和生产报表
代码同上省去 如果需要还可以对报表的格式进行自定义设计。
5 结束语 水晶报表技术是实际软件开发中应用很广的技术改变了以往程序设计中数据呈现效果单一、格式设计困难的局面上述介绍的各种模式水晶报表和交叉表的实现均通过实际验证对软件开发中使用水晶报表具有一定借鉴性。
参考文献 1 Cate McCoyCord Mari.水晶报表Crystal Reports9从入门到精通M.北京电子工业出版社2003 2 富君兆文忠米小珍翟封祥黄永生. NET平台下水晶报表的应用. 中国水运J 2007 76 168-169 3 张晓红. 水晶报表的制作方法. 辽宁财专学报J 2004 62 38-39 4 石俊萍. 基于C水晶报表数据源动态绑定的实现. 电脑与电信J 20095 21-22 5 任文. 水晶报表的应用. 硅谷J 20084 44-45 收稿日期10 月 15 日 修改日期12 月 3 日 作者简介洪颖1980-男安徽黄山人讲师硕士研究方向网络数据库、数据挖掘。
上接第34页 用的方法也不是最优的只为读者提供一种全新的学习SGeMS的思路。
参考文献 1 Andrei AlexandrescuModern C Design. Addison-Wesley Professional2001 2 Erich GammaRichard HelmRalph Johnsonet al. Design PatternsElements of Reusable Object - Oriented SoftwareM. Addison -Wesley Publising Company1995 3 Bruce EckelChuck Allision. Thinking in C Volume TwoPractical Programming. Pearson Education M2004 4 潘爱明张丽.C primer 中文版 M北京中国电力出版社 5 蔡志明卢传富李立夏. 精通QT4编程M北京电子工业出版社2008 6 David VandevoordeNicolai M. Josuttis陈伟柱译C template中文版北京人民邮电出版社2004.1 7 Erich GammaRIChard HelmRalph JohnsonJohn Vlissides著李英军等译设计模式M北京机械工业出版社20001 收稿日期9 月 25 日 修改日期11 月 3 日 基金项目国家自然科学基金项目“曲流河储层建模的自回避随机游走方法研究”。
项目编号50874091。
作者简介赵智宝1984-男河北省张家口人硕士主要研究方向计算机软件与理论张国梁1977-男陕西省户县人硕士主要研究方向地质图形可视化王家华1945-男教授主要研究方向为地质统计学算法、油气藏建模、油气田地质图形可视化。