




已阅读5页,还剩52页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京理工大学珠海学院2012届本科生毕业设计北京理工大学珠海学院毕业设计诚信承诺书本人郑重承诺:我所呈交的毕业设计电子词典设计与开发是在指导教师的指导下,独立开展研究取得的成果,文中引用他人的观点和材料,均在文后按顺序列出其参考文献,设计使用的数据真实可靠。承诺人签名: 日期: 年 月 日北京理工大学珠海学院2011届本科生毕业设计电子词典设计与开发摘 要随着社会的发展,以电子计算机为代表的现代科学获得了突飞猛进的发展,并且迅速与人们的日常生活结合在一起。计算机技术的发展给人们的生活带来很多方便,同时也推动新的电子产品的诞生,电子词典就是其中之一。虽然电子词典的出现到现在仅仅只有十几年的历史,然而,电子词典得到迅速发展,成为词典家族中最具有潜力的一员。目前,电子词典还没有完全取代传统词典,但由于它具有实用、快捷、准确、便捷、经济等特点,已经成为传统词典的有力竞争者。因此,本课题对英汉词典的开发与相关程序的编写开展了研究。课题对Trolltech公司的QT/Embedded的深入分析和研究的基础上,开发了基于Intel Pxa270的嵌入式电子词典。进而进行了相关的功能的设计。关键词:数据库 QT/Embedded 嵌入式电子词典 Design and Development of Electronic DictionariesABSTRACTWith the development of society, as represented by the modern computer science to the rapid development and quickly with peoples daily lives together. Development of computer technology to bring a lot of peoples lives easy, but also to promote the birth of new electronic products, electronic dictionary is one of them. Although the emergence of electronic dictionary is only now just ten years of history, however, the rapid development of electronic dictionaries, a dictionary of the most promising family of a member. Currently, the electronic dictionary has not completely replace the traditional dictionary, but because it has a practical, fast, accurate, convenient, economical, has become a strong competitor of traditional dictionaries. Therefore, the issue of English-Chinese dictionary program development and preparation of relevant studies carried out.Subject to the Trolltechs QT / Embedded-depth analysis and research, based on the developed based on Intel Pxa270 embedded electronic dictionary. Then carried out the functions related to the design.Key words:Database QT/Embedded Embedded electronic dictionary目 录摘 要IIIABSTRACTIV1 前言11.1概述11.2研究背景11.3研究目标11.4需求分析21.4.1用户需求分析21.4.2功能需求分析21.5本章小结32 QT简介42.1QT的背景介绍42.2 QT实现的结构原理42.3QtSql模块简介52.3.1Qt数据库驱动程序52.3.2连接和查询62.3.3查看表142.4QT应用程序的实现172.5本章小结183 SQLite及SQLite Expert Profession193.1SQLite简介193.1.1SQLite的功能193.1.2SQLite的特性203.2 SQLite Expert Professional的介绍213.2.1利用SQLite Expert Professional把其它数据库中的数据转换成SQLite中的数据213.3本章小结234 系统框架描述244.1系统模块244.2主要功能244.3平台简介244.4 UP-TECHPXA270-S核心模块资源264.5本章小结275 详细设计285.1数据库设计285.1.1数据库需求分析285.1.2系统逻辑分析285.1.3数据库的连接以及建表285.2程序实现原理图295.3程序流程图305.4界面设计305.4.1主窗体设计305.4.2子窗体设计325.5 电子词典的功能实现335.5.1单词搜索335.5.2加入生词本345.5.3删除词条345.5.4添加词条355.6本章小结366 测试及运行结果376.1测试目标376.2测试预期结果376.3运行结果376.3.1单词搜索386.3.2加入生词本396.3.3删除词条406.3.4添加词条416.4本章小结427 论文总结43参考文献44附 录45谢 辞5151北京理工大学珠海学院2011届本科生毕业设计1 前言1.1概述随着新的ARM芯片不断问世以及这些芯片的价格下降,嵌入式产品开始潜移默化的取代早期的一些单片机,并在社会各行各业中占有越来越重要的位置,嵌入式产品也由此成为众多工程师选择开发高端产品的芯片首选。QT具备跨平台,易扩展,界面华丽,性能稳定等优点。因此,以嵌入式处理器作为硬件平台,以QT作为程序框架,两者的完美结合必将成为未来技术的发展方向。1.2研究背景任何一种词语,使用频率高了,就会成为公共词汇。英语作为一种国际通用性语言,部分单词已成为公共词汇,并且直接应用到汉语中来。因其表达简洁,准确而受到人们青睐。但是,这些新引入或者比较专业词汇,对于较少关注新闻,接触网络的群体而言,就会造成阅读困难。传统的纸质英汉词典因为更新周期久,携带不便,价格相对昂贵而不能广泛应用。方便,高效,快捷的电子词典才能满足现代人的需要。市面上的嵌入式产品各式各样,用到的嵌入式操作系统自然也是有所不同。如果拥有一个跨平台的程序的话,那将会给我们的开发节省了大量的时间。QT正是一个支持多平台的C+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。所以使用QT作为应用程序框架是一个不错的选择。1.3研究目标基于上述背景,开发一个电子地图项目,使用windows CE5.0搭配PXA270开发板来构建这个项目。使用mapinfo电子地图绘制软件自主绘制电子地图。利用QT4作为系统应用层的程序框架。根据系统的需求,裁减、移植windowsCE内核。分析系统功能和接口,添加各种驱动程序,如:USB驱动,COM口驱动等。根据应用程序中的每个功能模块,分析各个模块的用户界面接口和对人机交互图形化用户界面的接口设计。1.4需求分析1.4.1用户需求分析目前市场上一些常见的电子词典产品有如下几种:1、基于PC的电子词典2、专用电子词典3、嵌入式电子词典基于PC的电子词典,可移动性差。使用时必须有一台PC机,而且该PC机至少要安装有电子词典软件才能使用,对使用带来了很大的局限性。专用电子词典,局限在青少年群体中。类似文曲星/诺亚舟等电子词典大部分还是应用在青少年群体中,但是这类词典是一个独立的电子产品,较少随身携带。而且在中老年人极少有人使用这种产品。嵌入式电子词典,具有电子词典的功能,可以安装到我们平时使用频率最高的电子产品手机或者其他嵌入式产品中,为使用带来了极大的方便。对此,本项目采用免费版的QT4作为程序框架,并且可以跨平台使用,在开发成本上有着很大的优势。 未来几年,电子词典市场将逐渐走向成熟,市场需求和产品销量会保持大幅增长,产品供应链中的各类企业将获得巨大商机。尤其是随着产品价格的不断下降,这种快速发展的态势会愈加明显。电子词典在中国市场必然会获得更大的发展空间。由此,本项目也适应用户需求,开发电子词典的相关功能:单词搜索显示功能、单词阅读功能、新词添加功能、生词复习功能等。1.4.2功能需求分析根据用户需求,和对产品的定位,划分以下功能:表1-1 用户需求功能支持功能所需硬件1 单词搜索2 单词阅读3 新词添加4 生词复习UP-TECHPXA270-S为硬件开发平台支持功能分析:1. 单词搜索:为用户提供方便,快捷的单词搜索功能,快速地显示单词的解释以及用法。2. 单词阅读:为用户的发音提供了极大的方便。3. 新词添加:用户可以根据自己的需要完善自己电子词典的词库。4. 生词复习:用户可以将自己感觉有用的生词列为自己的生词,方便以后自己学习的复习。所需硬件分析:需要的硬件模块在UPTECHPXA270S硬件实验平台上已一应俱全。在此平台上还配制了8英寸的TFT真彩液晶屏,支持640*480的分辨率。UPTECHPXA270S在存储系统方面也有着很高的配置,内置了高性能价格比的NAND FLASH 64M内存,支持大容量的用户差异图形图片和媒体文件的存储。CPU的能力当然是毋庸置疑的,Intel Xscale结构芯片的PXA270在各方面都表现了很强悍的能力,在目前市场上来说也是一款很先进的处理器芯片。PXA270处理器是Intel公司目前性能最为强劲的移动处理器,已经成为高端移动设备中最受欢迎的处理器之一。PXA270最高主频可达624MHz,它引入了X86架构奔腾4系列上的多媒体技术MMX技术,能够大大提升多媒体处理能力,用户通过该技术可以在VGA上面播放高质量的MPGE4视频;同时加入了Intel SpeedStep动态电源管理技术,在保证CPU性能的情况下,最大限度地降低移动设备功耗。1.5本章小结本章主要介绍本项目的选题背景、意义,选题目标和项目需求分析,根据产品市场和本人技术水平情况,按需求划分软件功能模块,还根据软件功能和现有资源的性能对硬件需求做了详细分析。2 QT简介2.1QT的背景介绍Qt/Embedded 是著名的Qt库开发商Trolltech公司开发的面向嵌入式系统的Qt版本,开发人员多为KDE项目的核心开发人员。许多基于Qt的X Window程序可以非常方便地移植到Qt/Embedded上,与X11版本的Qt在最大程度上接口兼容,延续了在X上的强大功能,在底层彻底摒弃了X lib,仅采用framebuffer作为底层图形接口。Qt/Embedded类库完全采用C+封装。丰富的控件资源和较好的可移植性是Qt/Embedded最为优秀的一方面,使用X下的开发工具Qt Designer可以直接开发基于Qt/Embedded的UI(用户操作接口)界面。越来越多的第三方软件公司也开始采用Qt/Embedded开发嵌入式下的应用软件。2.2 QT实现的结构原理Qt/Embedded是Trolltech公司开发的面向嵌入式系统的Qt版本,与X11版本的Qt在最大程度上接口兼容,采用帧缓存(framebuffer)作为底层图形接口。Qt/Embedded类库完全采用C+封装,并且有着丰富的控件资源以及较好的可移植性,大范围的Qt/Embedded API可用于多种开发项目。Qt/Embedded的实现结构如下:图2-1 QT的实现结构图Qt/Embedded 的底层图形引擎基于framebuffer。Framebuffer 驱动程序的实现分为两个方面:一方面是对LCD及其相关部分的初始化,包括画在缓冲区的创建和对DMA通道的设置;另外一方面是对画面缓冲区的读写,具体到代码为read、write、lseek等系统调用接口。至于将画面缓冲区的内容输出到LCD显示屏上,则由硬件自动完成。对于软件来说是透明的。当对于DMA通道和画面缓冲区设置完成后,DMA开始正常工作,并将缓冲区中的内容不断发送到LCD上。这个过程是基于DMA对于LCD的不断刷新的。基于该特性,framebuffer驱动程序必须将画面缓冲区的存储空间(物理空间)重新映射到一个不加高缓存和写缓存的虚拟地址区间中,这样能才保证应用程序通过mmap将该缓存映射到用户空间后,对于该画面缓存的写操作能够实时的体现在LCD上。QT程序是基于C+编写的,图形用户界面编程同时需要运行效率和高水平的灵活性。Qt通过结合C+的速度为这一领域提供了Qt对象模型。Qt把下面这些特性添加到了C+当中: 一种被称为信号和槽的非常强大的机制;可查询和可设计的属性项;强大的事件和事件过滤器;根据上下文进行国际化的字符串翻译;完善的时间间隔驱动的计时器等。 许多Qt的特性是基于QObject的继承,通过标准C+技术实现的。QApplication是必须构造的Qt主对象,需要在一开始的时候就构造这个对象,并把命令行参数传递给这个对象,每个Qt应用程序有且仅有一个QApplication对象,该对象必须在做其他事之前创建,这个对象处理一些底层操作,如事件处理、字符串本地化和控制界面外观等。信号和信号处理函数是GUI应用程序用来响应用户输入的基本机制,也是所有GUI库的核心特征,Qt的信号处理机制由信号(signal)和槽(slot)构成,它们相当于GTK+中的信号和回调函数。在Qt中回调函数就叫做槽。信号和槽用于对象间的通讯,它的基本语法为:connect(object1,signal1,object2,slot1);2.3QtSql模块简介2.3.1Qt数据库驱动程序QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口。这个接口利用Qt的模型/视图结构将数据库与用户界面集成的一套类来支持。QsqlDatabase对象表征了数据库的关联。Qt使用驱动程序与各种数据库的应用编程接口进行通信。Qt的桌面版包括如下一些驱动程序:驱动程序数据库QDB2IBM DB2.7版以及更新的版本QIBASEBorland InterfaceQMYSQLMySQLQOCI甲骨文公司(Oracle Call Interface)QODBCODBC(包括微软公司的SQL服务器)QPSQLPostgreSQL的7.3版以及更高级的版本QSQLITESQLite第3版QSQLITE2SQLite第3版QTDSSybase自适应服务器由于授权许可的限制,Qt的开源版本无法提供所有的驱动程序。当配置Qt时,既可以选择Qt本身就包含的SQL驱动程序,也可以以插件的形式建立驱动程序。公共领域中不断发展的SQLite数据库将向Qt提供支持。对于那些习惯了SQL语法的用户,QsqlQuery类提供了一种直接执行任意的SQL语句并处理其结果的方式。对于那些喜欢更高级、更友好的数据库界面以避免SQL语法的用户,QsqlTableModel和QsqlRelationalTable-Model提供了合适的抽象。这些类以与Qt其他模型类相同的方式来表示一个SQL表。它们可以被单独用来遍历和编辑程序代码中的数据,也可以添加最终用户能够查看并修改数据的视图。 Qt使对常见数据库特性的编程变得简单易懂;Qt也让利用窗体或图形用户界面中的表查看数据库表的过程变得简单易行。2.3.2连接和查询为了执行SQL查询,首先必须建立与数据库的连接。通常情况下,是在应用程序开始时所调用的一个单独的函数中建立数据库连接。例如:Bool createConnection() QsqlDatabase db=QsqlDatabase:addDatabase(“QMYSQL”); db.setHostName(“”); db.setDatabaseName(“musicdb”); db.setUserName(“gbatstone”); db.setPassword(“T17Av44”); if(!db.open()QmessageBox:critical(0,Qobject:tr(“Database Error”); Db.lastError().text();return false;Return true;首先调用QsqlDatabase:addDatabase()来创建QsqlDatabase对象。addDatabase()的第一个参数指定了Qt必须使用哪一个数据库驱动程序来访问这个数据库,这里使用的是MySQL.接下来,设置数据库的主机名、数据库名、用户名和密码,并且打开这个连接。如果open()操作失败,将显示出错误信息。通常情况下,是在main中调用createConnection()的:Int main(int argc,char*argv) Qapplication app(argc,argv); If(!createConnection() Return 1; Return app.exec();一旦连接建立,就可以使用QsqlQuery执行底层数据库支持的任何SQL语句。例如,以下是如何执行SELECT语句的代码:QsqlQuery query;Query.exec(“SELECT title,year FROM cd WHERE year=1998”);在exec()调用之后,可以遍历查询的结果集:While(query.next() Qstring title=query.value(0).toString(); Int year=query.value(1).toInt(); Std:cerrqPrintable(tible)”:”year=1998”);可以通过对查询调用isActive()来检查是否有错误发生:If(!query.isActive()QmessageBox:warning(this,tr(“Database Error”), query.lastError().text();如果没有错误发生,则查询会变成“激活”状态,然后就可以使用next()来遍历结果集。执行INSERT的代码与执行SELECT的一样容易:QsqlQuery query(“INSERT INTO cd(id,artistid,title,year)”“VALUES(203,102,Living in America,2002)”);在这之后,numRowsAffected()返回SQL语句影响的行数(如果发生错误,就返回-1)。如果需要插入多条记录,或者想避免将数值转换成为字符串(并且正确地转义它们),可以使用prepare()来指定一个包含占位符的查询,然后赋值绑定想插入的数值。Qt对所有数据库都支持Oracle风格和ODBC风格的占位符语法,如果它们可用,就使用本地支持;如果不可用,就模拟它的功能。以下是Oracle风格语法及命名占位符的实例:QsqlQuery query;query.prepare(“INSERT INTO cd (id ,artistid,title,year)”“VALUES(:id,:artistid,:title,:year)”);query.bindValue(“:id”,203);query.bindValue(“:artistid”,102);query.bindValue(“:title”,”Living in America”);query.bindValue(“:year”,2002);以下是一个使用ODBC风格位置占位符的相同实例:QsqLquery query;query.prepare(“INSERT INTO cd (id, artistid,title,year)”“VALUES(?,?,?,?)”);query.addBindValue(203);query.addBindValue(102);query.addBindValue(“Living in America”);query.addBindValue(2002);query.exec();在exec()调用之后,可以调用bindValue()或者addBindValue()来赋值绑定新值,然后再次调用exec()并利用这些新值执行查询。占位符通常用于指定二进制数据或者包含非ASCII码或者非Latin字符串。在底层,Qt对支持Unicode编码,而对于不支持Unicode的,Qt会明确地把字符串转换为合适的编码方式。如果数据库中SQL事务处理可用的话,Qt就支持它。为了开始事务处理,需对代表数据库连接的QsqlDatabase对象调用transaction()。为了结束事务处理,可以调用commit()或者rollback()。例如,以下是如何查询外键并且在事务处理中执行INSERT语句的代码:QSqlDatabase:database().transaction();QsqlQuery query;Query.exec(“SELECT id FROM artist WHERE name=Gluecifer”);If(query.next() int artistId=query.value(0).toInt(); query.exec(“INSERT INTO cd(id,artistid,title,year)”“VALUES(201,”+Qstring:number(artistId)+”,Riding the Tiger,1997)”);QsqlDatabase:database().commit();QsqlDatabase:database()函数返回一个表示在createConnection()中创建的连接的QsqlDatabase对象。如果事务处理不能启动,QSqlDatabase:transaction()就返回false值。一些数据库不支持事务处理。对于这类数据库,transaction(),commit()和rollback()几个函数就什么也不做。可以使用hasFeature()对数据库相关的QsqlDriver进行测试,看看这个数据库是不是支持事务处理。QsqlDriver*driver=QSqlDatabase:;database().driver();if(driver-hasFeature(QsqlDriver:Transactions)还可以测试其他数据库特征,包括数据库是否支持BLOB、Unicode以及经过处理的查询。使用QsqlDriver:handle()和QsqlResult:handle()函数,还可以读取低级数据库驱动程序句柄和查询结果集的低级句柄。但如果不清楚其使用目的与细节的话,这两个函数的使用非常容易出错。目前为止,在我们研究的实例中,都是假设应用程序所使用的是单一的数据库连接。如果想创建多个连接,可以把数据库名作为第二个参数传递给addDatabase().例如:QSqlDatabase db=QSqlDatabase(“QPSQL”,”OTHER”);db.setHostName(“”);db.setDatabaseName(“starsdb”);db.setUserName(“hilbert”);db.setPassword(“ixtapa7”);然后,可以通过把数据库名传递给QSqlDatabase:database()得到指向QSqlDatabase对象的指针:QSqlDatabase db=QSqlDatabase:database(“OTHER”);为了使用其他连接执行查询,我们把QSqlDatabase对象传递给QsqlQuery的构造函数:QSqlQuery query(db);Query.exec(“SELECT id FROM artist WHERE name=Mando Diao”);如果想一次执行多个处理事务,多重连接是很有用的,因为每个连接只能处理一个有效的事务处理。当使用多个数据库连接时,还可以有一个命名的连接,而且如果没有具体指定的话,QSqlQuery就会使用这个未命名的连接。除了QSqlQuery之外,Qt提供了QsqlTableModel类作为一个高级界面接口,让我们不必使用原始的SQL语句来执行大多数常用的SQL操作。这个类可以用来独立处理数据库而不涉及任何的图形用户界面,它可以用作QlistView或QtableView的数据源。以下是使用QsqlTableModel执行SELECT操作实例:QsqlTableModel model;Model.setTable(“cd”);Model.setFilter(“year=1998”);这等价于如下的查询:SELECT*FROM cd WHERE year=1998利用QsqlTableModel:record()获得某一给定的记录,或者利用value()读取单独的字段,我们可以遍历这个结果集:For(int i=0;imodel.rowCount();+i) QsqlRecord record=model.record(i); Qsting title=record.value(“title”).toString(); Int year=record.value(“year”).toInt(); Std:cerrqPrintable(title)”:”yearstd:endl;QSqlRecord:value()函数既可以接收字段名也可以接收字段索引。在对大数据集进行操作时,建议利用索引来指定字段。例如:int titlleIndex=model.record().index0f(“title”);int yearIntdex=model.record().index0f(“year”);for (int i=0;imodel.rowCount();+i) QSqlRecord record=model.record(i); QString title=record.value(titleIndex).toString(); int year=record.value(yearIndex).toInt(); std:cerrqPrintable(title)”:”yearstd:endl;为了在数据库表中插入记录,可调用insertRow()来创建一个新的空行(记录),然后使用setData设置每一个列(字段)的值:QsqlTableModel model;Model.setTable(“cd”);Int row=0;Model.insertRows(row,1);Model.setData(model.index(row,0),113);Model.setData(model.index(row,1),”Shanghai My Heart ”);Model.setData(model.index(row,2),224);Model.setData(model.index(row,3),2003);Model.submiAll();在调用submitAll()之后,记录可能会移动到一个不同的行位置,这取决于表是如何排序的。如果插入失败,submitAll调用将返回false。SQL模型与标准模型之间最大的区别在于:对于SQL模型,必须调用submitAll()以将发生的更改写入数据库。为了更新某一记录,首先必须把QsqlTableModel定位到要修改的记录上例如使用select()。然后提取这条记录,更新想改变的字段并将更改过的数据回写到数据库中:QsqlTableModel model;Model.setTable(“cd”);Model.setFilter(“id=125”);Model.select();If(model.rowCount()=1) QsqlRecord record=model.record(0); Record.setValue(“title”,”Melody A.M.”); Record.setValue(“year”,record.value(“year”).toInt()+1); Model.setRecord(0,record); Model.submitAll();如果有一条记录与指定的过滤器相匹配,就利用QsqlTableModel:record()获得这条记录。并用修改后的记录复写原始的记录。正如对非SQL模型所作的处理一样,也可以使用setData()来执行更新。我们获得的模型索引都是针对给定的行与列的:Model.select();If(model.rowCount()=1) Model.setData(model.index(0,1),”Melody A.M.”); Model.setData(model.index(0,3), Model.index(0,3).toInt()+1); Model.submitAll();删除记录与更新记录的过程很相似:Model.setTable(“cd”);Model.setFilter(“id=125”);Model.select();If (model.rowCount()=1) Model.removeRows(0,1); Model.submitAll();removeRows()调用删除了第一条记录的行号以及记录号。下面的实例则删除了所有与过滤器匹配的记录:model.setTable(“cd”);model.setFilter(“year0) model.removeRows(0,model.rowCount(); model.submitAll();QSqlQuery和QsqlTableModel这两个类提供了Qt和SQL数据库之间的接口。利用这些类,可以创建显示用户数据以及让用户插入、更新和删除记录的表单。对于使用SQL类的应用程序,需要将如下的命令行添加到其.pro文件中:QT+=sql这将确保应用程序可以连接到QtSql库。2.3.3查看表如图2-3所示的Scooters应用程序,给出了踏板车(scooter)的型号表。该实例基于单一的scooter表,其定义如下:CREATE TABLE scooter( Id INTEGER PRINMARY KEY AUTOINCREMENT,Name VARCHAR(40) NOT NULL,maxspeed INTEGER NOT NULL,maxrange INTEGER NOT NULL,weight INTEGER NOT NULL,description VARCHAR(80) NOT NULL);)图2-3在采用SQLite的情况下,id字段的值都是由数据库自动生成的,而其他类型的数据库可能会使用不同的语法来完成。为了便于维护,我们利用枚举类型变量enum为表的列索引号给出有具体含义的命名:enum Scooter_Id=0,Scooter_Name=1,Scooter_MaxSpeed=2,Scooter_MaxRange=3,Scooter_Weight=4,Scooter_Description=5,如下给出了建立QsqlTableModel以显示scooter表所需的代码:model=new QsqlTableModel(this);model-setTable(“scooter”);model-setSort(Scooter_Name,Qt:AscendingOrder);model-setHeaderData(Scooter_Name,Qt:Horizontal,tr(“Name”);model-setHeaderData(Scooter_MaxSpeed,Qt:Horizontal,tr(“MPH”);model-setHeaderData(Scooter_MaxRange,Qt:Horizontal,tr(“Miles”);model-setHeaderData(Scooter_Weight,Qt:Horizontal,tr(“Lbs”);model-setHeaderData(Scooter_Description,Qt:Horizontal,tr(“Desc-ription”);model-select();创建模型的过程与上节中所描述的相似,不同之处在于,这里使用了我们自己的列标题。如果不这样做,则列标题将采用原始的字段名。我们还使用setSort()指定了一个排序,它在后台运行的程序中通过ORDER BY句子实现。我们已经创建了模型并利用select()将其以数据组装,还可以创建一个视图来显示它:view=new QTableView;view-setModel(model);view-setSelectionMode(QabstractItemView:SingleSelection);view-setSelectionBehavior(QabstractItemView:SelectRows);view-setColumnHidden(Scooter_Id,true);view-resizeColumnsToContents();view-setEditTriggers(QabstractItemView:NoEditTriggers);QheaderView*header=view-horizontalHeader();Header-setStrechLastSection(true);因为QsqlTableModel(间接)派生自QabstractItemModel,它可以很容易地作为QTableView数据源使用。setModel()调用是连接视图和模型唯一必需的调用,其余的代码仅用来定制表以使其具有更友好的用户界面。选择模式指定了用户可以选用的所有可能模式,这里我们使单独的单元格(字段)可选。被选中的单元格通常用一个带点的轮廓线包围。选择状态指定了被选择项如何在考虑整行的情况下实现可视效果。被选项通常由不同背景颜色来表示。这里隐藏ID列,因为对于用户来说,ID并无意义。此外,还设置NoEditTriggers以使表视图具有只读属性。显示只读表的另一方式是使用QsqlTableModel的基类QsqlQueryModel.该类提供setQuery()函数,因此它可设置复杂的SQL查询以提供含一个或多个表的专门视图例如,使用SQL表连接算法(join)。与Scooters应用程序的数据库不同,大多说数据库都存在着大量的表与外键关联(在关系数据库中,外键表示两表间的引用约束)。Qt提供了QsqlRelationalTableModel,它是一个可以利用外键来显示和编辑表的QsqlTableModel子类。除了可以为每一个外键QsqlTableModel添加到模型以外QsqlRelationTableModel与QsqlTableModel的功能非常相似。在许多情况下,外键一个ID字段和一个命名字段。虽然在后台程序中相应的ID字段才是真正被使用的字段,但利用QsqlRelationalTableModel,可以确保用户能看到和更改外键的命名字段。为了让其有效运作,必须对用于显示模型的视图设置一个QsqlRelationalDelegate类(或者是一个用户自定义的子类)。2.4QT应用程序的实现由以上简介可知,Qt是一个创建GUI程序的C+类库,编写Qt应用程序的主要工作是基于已有的Qt类编写用户类。Qt提供了一组范围相当广泛的C+类库,并包含了几种命令行和图形界面的工具,有效地使用这些工具可以加速开发过程。Qt Designer:Qt设计器。用来可视化地设计应用程序界面。Qt Linguist:Qt语言学家。用来翻译应用程序。以此提供对多种语言的支持。Qmake:使用此工具可以由简单的、与平台无关的工程文件来生成编译所需的Makefile。Qt Assistant:关于Qt的帮助文件。类似于MSDN。可以快速地发现你所需要的帮助。moc:元对象编译器。uic:用户界面编译器。在程序编译时被自动调用,通过ui_*.h文件生成应用程序界面。Qt应用程序的设计使用基于工程的方法,并通过.pro文件进行工程管理。实现应用程序的第一步是编写.pro文件,然后使用QT4自带的qmake工具生成Makefile,最后进行源代码的编译。Qmake的过程如下:qmake project /生成.pro的工程文件qmake /生成Makefilenmake /编译2.5本章小结随着越来越多的第三方软件公司利用Qt/Embedded开发嵌入式的应用软件,Qt的应用已经越来越广泛。本章主要介绍了QT的背景和描述了QT实现的结构原理,还简述了QT的相关特性。此外,也介绍了QT应用程序开发时的相关工具。3 SQLite及SQLite Expert Profession3.1SQLite简介SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论