Linux下电子词典的设计与实现

Linux下电子词典的设计与实现


2024年2月8日发(作者:麦芒11参数)

Linux下电子词典的设计与实现

摘要

随着嵌入式技术的发展,智能移动终端的普及,用户对数据处理和管理需求也不断提高,更多的用户群也越来越希望能对嵌入式产品中的数据进行更有效的管理,嵌入式数据库便是一个非常有效的工具。如何在智能终端中使用嵌入式数据库以及如何让嵌入式数据库在嵌入式设备中充分有效的使用有限的存储资源成为嵌入式系统研究的重要方向。本文的主要任务是对电子词典的设计,主要功能有英译汉、汉译英、生词库储存等。本设计主要应用的技术有数据库、Qt、本设计用SQLite的B+树索引机制进行改进,将改进后的

SQLite与 Qt/Embedded相结合设计和实现智能终端中的电子词典。本设计的特点是操作简单、快速、实用性强。

关键词:嵌入式,用户界面,数据库,B+树

The Design and Implementation of Electronic Dictionary Based

on Linux

Abstract

With the development of embedded technology, the popularity of smart mobile devices,

users of data processing and management needs is also rising, more and more users want to be

able to embedded products for more efficient data management, embedded database is a very

effective tool. How intelligent terminal using the embedded database and how to make an

embedded database in embedded devices fully effective use of the limited storage resources has

become an important research direction of embedded systems. The main task is to design

electronic dictionary, the main function of Chinese Translation, Chinese to English, raw

thesaurus storage. The main application of the technology are designed database, Qt, this design

SQLite B + tree indexing mechanism to improve the improved SQLite with Qt / Embedded

combining design and implementation of intelligent terminal electronic dictionary. This design is

characterized by simple, fast, and practical.

KeyWords: Embedded,Qt,SQLite,B+ tree

II

目 录

摘要 ........................................................................ I

Abstract ................................................................... II

第1章 绪 论 ............................................................ - 1 -

1.1 研究背景和意义 .................................................. - 1 -

1.2 数据库在电子词典中的应用 ........................................ - 1 -

第2章 系统需求分析 ..................................................... - 3 -

2.1用户需求分析 ..................................................... - 3 -

2.2可行性分析 ....................................................... - 3 -

第3章 相关技术 ......................................................... - 5 -

3.1 Qt/Embedded体系结构与框架 ....................................... - 5 -

3.2 Qt/Embedded的信号与槽机制 ....................................... - 5 -

3.2.1 信号与槽的连接与实现 ....................................... - 6 -

3.2.2 元对象编译器 ............................................... - 6 -

3.3 SQLite数据库 .................................................... - 7 -

3.4 SQLite的索引机制 ................................................ - 7 -

3.4.1 B+树的概念 ................................................. - 8 -

3.4.2 B+树查找 ................................................... - 8 -

3.4.3 B+树插入 ................................................... - 8 -

3.4.4 B+树删除 ................................................... - 9 -

第4章 电子词典的设计与实现 ............................................ - 10 -

4.1 建立电子词典的开发与运行环境 ................................... - 10 -

4.2 使用Qt/Embedded设计运用程序的方法 ............................. - 10 -

4.3 电子词典的界面设计与实现 ....................................... - 11 -

4.4 电子词典的功能设计与实现 ....................................... - 12 -

4.4.1 系统的功能模块图 .......................................... - 12 -

4.4.2 功能的实现步骤 ............................................ - 12 -

第5章 系统的界面实现 .................................................. - 15 -

5.1 主界面 ......................................................... - 15 -

5.2 生词本界面 ..................................................... - 15 -

III

5.3 添加单词界面 ................................................... - 16 -

5.4 编辑单词界面 ................................................... - 16 -

第6章 电子词典设计中遇到的问题 ........................................ - 18 -

6.1 设计中文查询功能的问题 ......................................... - 18 -

6.2 音标正确显示的实现 ............................................. - 18 -

第7章 总结 ............................................................ - 19 -

参考文献 ............................................................... - 20 -

致谢 ................................................................... - 21 -

附录 ................................................................... - 22 -

IV

第1章 绪 论

1.1 研究背景和意义

随着计算机技术的飞速发展,嵌入式系统已经成为该领域的一个重要方面,得到了更多的应用。“嵌入式"对我们来说不再是一个陌生词,早已深入生活的每一个角落,电子词典、自动取款机、电视机顶盒、PDA、MP4、智能手机、电子医疗仪器、电梯等等,嵌入式设备可谓说是在我们日常生活中处处可见。而且,随着智能移动终端的多样化,嵌入式技术快速发展,用户对管理的需求及数据的处理不断的提高,越来越多的用户渴望对嵌入式产品的数据进行更好的管理,嵌入式数据库可谓说是十分重要。

电子词典是种将传统的印刷词典转成数码方式、进行快速查询的数字学习工具。电子词典以轻便易捷、查询快捷等特点,成为21世纪学生学习生活、社会人士移动办公的掌上利器。在中国,电子词典的主要目标客户是英语学习人群,应该说,这个人群庞大的基数和每年数以千万记的增长量,为电子词典市场提供了滚滚而来的商机和极其广阔的发展空间。

电子词典的设计就需要用到数据库,嵌入式数据库大多用于电子产品中,比如智能手机、PDA、车载设备等内存空间比较有限的嵌入式设备。由于嵌入式系统存储空间有限,所设计的产品需要对某种数据库处理数据时,则需利用的存储容量小,这样才能使效率更高。怎样让嵌入式数据库在嵌入式设备中更好的被应用及怎样在嵌入式设备中使嵌入式数据库更有效的利用存储资源成为电子产品设计及研究的重要方向。

基于上述原因,对深入研究一种相对成熟、快速、简单易用和能改进空间利用率的电子词典具有重要的意义。

1.2 数据库在电子词典中的应用

随着移动计算机时代的到来,数据库技术随着计算机的发展不断的进步,嵌入式数据库的技术已从初步的研究阶段步入应用阶段。数据库系统对嵌入式的操作系统的贡献为数据库的技术开辟了更广阔的发展空间。目前已经在移动平台、电子产品比如智能电子词典、数字电视机等领域有了广泛应用。随着用户对数据的管理要求及实时处理的不断提高,移 - 1 -

动智能终端普及,嵌入式数据库的优越性越来越突出,得到了各个国家的青睐。各个研究机构都对嵌入式数据库展开了更进一步的研究。

在国内,北京网易研制的“有道词典”是网易有道推出的词典相关的服务和软件。基于有道搜索引擎后台的海量网页数据以及自然语言处理中的数据挖掘术。数据库在嵌入式操作系统中形成一个数据库环境,在电子词典的设计中嵌入式数据库主要是对其进行数据计算及数据存储管理。它可以完成数据的查询、修改、增加、删除等功能。还有国内其他一些研究机构和公司已经推出了自己的嵌入式数据库系统或者正在进行着这方面的研究工作。

- 2 -

第2章 系统需求分析

2.1用户需求分析

随着科学技术的不断提高,计算机科学日渐成熟,电子词典也越来越受到人们的欢迎。纵观传统的文本词典,不仅查询效率不高、不易携带,而且存储容量有限;与此同时,传统词典的单词印刷出错误码率高,同时内容越来越难以满足用户的需求。而电子词典与传统文本词典相比较,有着无法比拟的优越性:多种多样的检索方式、便利的查询窗口、灵活的显示界面和连续的参见功能,无一不体现这种知识媒体的智能化和人性化特色;电子多媒体在词典中的应用,更使得单调、呆板的词典变得形象生动在词典中获取知识变得轻松和快捷。

当今社会的发展使人们越来越清楚地看到单词查询方面的重要性,它直接决定查询效率与质量。所以电子词典软件将在当今个人单词查询中发挥越来越重要的作用。通过对目前软件市场的分析可知,大多的传统词典,有功能方面不能满足客户的需求。因此,开发这样一套多功能电子词典系统是一件很有必要的事情。

2.2可行性分析

可行性分析的目的是使用最小的代价在尽可能短的时间里确定问题是否能解决,通过复杂系统的规模与目标,研究与此类似的系统后,我具体从下面几个方面考虑:

(1) 技术上的可行性

电子词典的开发已有一定的时期,而且有很多成功的实例,技术基础也已经非常雄厚,因而技术上的准备应该不成问题。

(2) 经济上的可行性

由于所开发的是个电子词典,要求并不是很高,普通的计算机都可以实现,所以从各方面来说都是可行的。

(3) 操作上的可行性

本系统不要求使用者对开发工具有任何了解,用户仅需按自己的需求点击自己想要进入的界面,在查询模块里输入自己所需要查询的词汇,就可以得到自己所需要的与之相关 - 3 -

的信息。

(4) 结论

通过各方面条件的调查和研究,对项目的可行性做出结论,电子词典项目的开发是可行的。

- 4 -

第3章 相关技术

3.1 Qt/Embedded体系结构与框架

Qt/Embedded是著名开发商Trolltech的Qt库,它于2001年发明了嵌入式系统的Qt版本,是个针对嵌入式系统的应用程序的框架与类库。由于Qt的便携性相当不错,很多基于Qt的Xwindow的程序可以很容易地移植到嵌入式系统。由于Qt/Embedded被发布在GPL条款下,所以有很多的嵌入式Linux开发人员研究Qt/Embedded系统,如摩托罗拉的Linux手机

“A780” 和“E680”使用的Qt/Embedded作为其图形用户界面。

就像Qt,对于Qt/Embedded来说,它也是用c++编写的。虽然它会增加系统的资源消耗,但却为开发人员提供了一个清晰的程序框架,使开发人员快速适应,而且能轻松的编写自定义用户界面程序。由于Qt/Embedded是作为产品推出的,所以它有良好的技术支持和开发团队。这是利用Qt/Embedded的开发来促进开发过程的,增加了产品的可靠性。综上所述Qt/Embedded具有一下特点:

(1) 与Qt一样,有相同的API.开发人员只需知道Qt的API,无需关心程序所使用的平台和系统。它具有良好的便携性。

(2)Qt/Embedded不需要任何额外的图形库,拥有自己的图形引擎,底层的图形驱动frameBuffer可以直接被进行操作。

(3) Qt/Embedded可运行在所有流行的CPU和平台上,与硬件平台无关。支持所有主要的嵌入式Linux,Qt/Embedded的基本需要。

3.2 Qt/Embedded的信号与槽机制

Qt的核心机制是信号和槽,为Qt的程序奠定好了基础。信号和槽是一个高层次接口,用于对象之间的通信,也是其他工具包与之区别的重要之处。Qt自己定义的信号和槽,它是一种通信机制。它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须使用一个被称为moc(Meta Object Compiler)的Qt工具,这是一个C++的Qt工具预处理程器,它是一个高层次的事件处理自动生成所需要的额外代码。信号和槽可以携带任何类型的参数和任何数量,它们是完全安全的类型,不会带来系统崩溃的危险。信号与槽构造了一个很大的 - 5 -

组件编程机制,接收信号主要利用槽,槽是普通对象的成员函数。一开始一个槽不知道自己是否可以与任何信号连接。此外,一个对象成员并不是了解具体的通信机制。单个的槽可以与很多信号进行连接,也可以是多个槽与单一的信号进行连接,还可以将单个信号之间进行连接。这样,当第一个信号传输系统时将立即启动第二个信号。

3.2.1 信号与槽的连接与实现

当某一个信号的所有者或拥有者内部状态发生变化,信号由一个对象发送。这个信号只可以由定义过它的类及派生类进行传输。若一个信号被传输后,将立刻执行与其相关联的槽,就好像调用一个正常的函数。所有的槽先返回后,传输函数(emit)才返回。假若存在多个与一个信号相关联的槽,则发射该信号后,这些槽将一个个被执行,值得注意的是它们执行的顺序是不确定的、随机的。信号和槽的连接原理如图2.2所示。

图2.2 信号和槽的连接原理

3.2.2 元对象编译器

moc(meta object compiler) 即元对象编译器,它是用来分析C++文件中的类声明并生产C++代码,以便用于初始化元对象。所有链接到函数的指针以及全部信号和槽的名字都包含在元对象中。

moc是信号与槽机制所必要的。元对象编译器读C++的源文件时,如果发现有Q_OBJECT宏声明的类,那么它就会生成另外一个C++的源文件,这个新生成的文件中包 - 6 -

含有该类的元对象代码。元对象编译器并没有扩展#define宏定义或#include,它仅仅是跳过所有遇到的任意预处理指令。用元对象编译器生成的C++源文件必须与类实现一起进行连接和编译,或者用#include语句将其包含到类的源文件中。

3.3 SQLite数据库

在2000年时,开发人员开发出一种小型的嵌入式数据库即SQLite。是一个自身就完全包含数据库引擎功能的小型的C语言链接库,它在嵌入式系统中很方便的可以使用。SQLtie对SQL92提供了大多数支持,它支持索引、视图、多个表、事务等一系列用户界面和驱动程序。速度非常快,易于使用,也提供了很多的数据库接口。这个库具有很强的凝聚力,它是完全开放的源代码可以应用于所有的领域。SQLite链接库的大部分接口的实现函数都能在main.c源文件中找到,为了避免和其它程序发生冲突,接口函数都以sqlite3为前缀。SQLite有自己的高度优化的分析器和生成器,它可以快速的生产出高效率的代码,而且它的新颖设计对内存溢出有着特别的抵抗力。SQLite有以下特点:

(1) 源代码完全开放,不管哪个界的用户都可以免费使用;

(2) 不受外部的影响,相对独立;

(3) 数据库是一个完整的,且储存在单一的磁盘文件中;

(4) 附有很好的源代码,并且注释的很清楚,方便用户自己学习,而且准确率达到90%以上;

(5) 当电源故障和系统崩溃之后,事务的操作仍是独立的、一致的、持久的;

SQLite的应用程序界面非常好用,数据库的操作也非常简单。比如排序、删除、插入、修改、查询只需简单的三个用来获得数据和执行SQL的函数。使用C语言的应用程序界面需三个步骤:1.提供所需文件以及查询的模式以便调出sqlite3 open()来与数据库连接,其中这里有两个参数,一个负责打开数据库的文件名,另外一个是用来返回数据库的。2.给出一个回调函数,SQLite执行回调函数(Callback)返回到数据库所获得的结果。3.执行sqtlite3_exec( ),将回调函数的指针和SQL查询语句作为函数参数进行传递。

3.4 SQLite的索引机制

对于电子词典的设计,查询的速度越快越好,这样我们就研究如何才能使查询单词的效率变得更高。sqlite3是使用优化的B树即B+进行结构索引。在关键字的顺序查找方面, - 7 -

数据库的效率得到大大的提升。这种索引可以进行多种方式进行查询,如随机查询、规范查询等。

3.4.1 B+树的概念

(1) 有n棵子树的结点中含有n-1个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子结点。

(2) 你的全部关键字的数据以及包含着所有关键字的记录指针都包括在叶子结点中,并且依据全部关键字的大小叶子结点自动连接。

(3) 凡是非最末端的结点都可以看作是索引部分,他们中只含其子树(根结点)中的最大(或最小)关键字。

3.4.2 B+树查找

B+树有两种查找方法:

1. 从根结点开始进行随机查找。2.从最小关键字起顺序查找。在查找时,若非最末端的结点的关键字等于给已知值时,并非终止,则是要继续查找直到叶子结点。其次B+树也可以通过由叶子结点所组成的链表来规范查找。

3.4.3 B+树插入

n阶B树的插入操作在叶子结点上进行,假设要插入关键值a,找到叶子结点后插入a,做如下算法判别:

1.如果当前结点是根结点并且插入后结点关键字数目小于等于m,则算法结束;

2.如果当前结点是非根结点并且插入后结点关键字数目小于等于m,则判断若a 是新索引值时转步骤4后结束,若a不是新索引值则直接结束;

3.如果插入后关键字数目大于n(阶数),则结点先分裂成两个结点X和Y,并且他们各自所含的关键字个数分别为:u=大于(n+1)/2的最小整数,v=小于(n+1)/2的最大整数;

由于索引值位于结点的最左端或者最右端,不妨假设索引值位于结点最右端,有如下操作:

(1) 如果当前分裂成的X和Y结点原来所属的结点是根结点,则从X和Y中取出索引的关键字,将这两个关键字组成新的根结点,并且这个根结点指向X和Y,算法结束;

(2) 如果当前分裂成的X和Y结点原来所属的结点是非根结点,依据假设条件判断, - 8 -

如果a成为Y的新索引值,则转步骤4得到Y的双亲结点P,如果a不是Y结点的新索引值,则求出X和Y结点的双亲结点P;然后提取X结点中的新索引值a,在P中插入关键字a,从P开始,继续进行插入算法;

4.提取结点原来的索引值b,自顶向下,先判断根是否含有b,是则需要先将b替换为a,然后从根结点开始,记录结点地址P,判断P的孩子是否含有索引值b而不含有索引值a,是则先将孩子结点中的b替换为a,然后将P的孩子的地址赋值给P,继续搜索,直到发现P的孩子中已经含有a值时,停止搜索,返回地址P。

3.4.4 B+树删除

B+树删除也是在叶子结点上操作,当要删除叶子结点中最大的关键字,则在非终端结点中值可以无需删除,一直保持存在。若因为删除使结点中的关键字的个数小于[n/2]时,则B+树删除方法如下:

(1) 被删除关键字所在的结点为叶结点,关键字数目大于或等于[n/2],则只需要直接删去关键字即可;

(2) 被删除关键字所在的结点为叶结点,关键字数目等于[n/2]-1,相邻的左右兄弟关键字数目至少有一方大于或者等于[n/2],此时,如果右兄弟关键字数目大于或者等于[n/2],则将右兄弟中最小的关键字向上移动到双亲结点中,然后将其中紧靠在向上移动的关键字左边的一个关键字移动到被删除关键字所在的结点的最右边;否则,如果左兄弟的关键字数目大于或者等于[n/2],则左兄弟中最大的关键字上移到双亲结点中,将紧靠在该上移关键字右边的一个关键字移动到被删除关键字所在的结点的最左边。这些做法类似于减法的借位运算。

(3) 被删除关键字所在的结点为叶结点,关键字数目等于[n/2]-1,相邻的左右兄弟关键字数目均等于[n/2]-1,则从双亲借关键字补充,然后算法进入非叶结点的删除判断。

- 9 -

第4章 电子词典的设计与实现

嵌入式系统其中一个主要应用范围是电子产品,为了是用户使用方便,现在开发人员主要生产手持电子类产品。随着嵌入式技术的前景越来越光明及电子类产品越来越受人们的青睐,对于所需产品的功能及美观提出了更多的要求。所以为了满足用户,本论文主要以设计电子词典为例,并且增加了应用功能以满足用户需要,本文使用Qt/Embedded和SQLite相结合设计了英语电子词典。它主要有三大功能:英汉查询、汉英查询、生词本增删词,下面将主要介绍这些功能的设计与实现。

4.1 建立电子词典的开发与运行环境

由于本论文开发电子词典的初衷是用于:如PDA、手机、车载设备等智能终端中,同时,Trolltech公司提供手机版和PDA版的Qtopia,其中手机版是商业版本,PDA版是免费版。因此本文选择在PDA版的Qtopia平台上发布应用程序。

Qt/Embedded开放了源代码,为了开发嵌入式Linux应用系统,使开发人员可以在GPL许可协议下随意的利用。程序要运行在Linux系统上,运行后可获得以下需要创建应用程序的包:

(1) designer是专门设计窗口界面组件的应用程序。用它来最后生成文件和文件;

(2) qmake工具用来生成file.pro文件;tmake是跨平台MakefiIe生成器。

(3) uic是从XML文件生成代码的用户界面编译器。其主要作用是将文件生成file.h和文件。

使用这几个工具就可以对电子词典进行运行开发、编译、调试。

4.2 使用Qt/Embedded设计运用程序的方法

对界面设计工具Qt来说,在设计的过程中常用的两种设计方法是:一种设计方法是采用图形化界面设计与源代码编写相结合的方式,可以用Qt desinger (Qt设计器)设计要求实现的界面,另一种方法是通过采用完全利用编写源代码来实现,这种方法是纯编码,要求 - 10 -

完全编写main文件、头文件以及运用文件,相对于Qt来说,就是完成*.cpp和*.h文件。但是它们有各自的优缺点,比如:

图形化界面设计方法,是根据自己的需求,通过改变组件的属性来完成。界面中所参与的信号/槽也是用信号/槽的属性窗口来设置。当界面设计好以后,就会自动生成一个不完整的main文件和*.cpp源文件,每个应用程序名称在信号槽设置中已定义,这时我们只需编写源文件中没有的内容。这种方法最大的缺点就是受到源程序、图形界面的改变及Qt

designer的限制的相互影响。

面向对象语言的设计方法很容易使用,无需Qt desinger的限制,使用的程序或文档库中包含的信号/槽实施更容易。优点就是你可以根据自己的设计需要采取更好的优势资源。其次,因为这种方法没有现成的程序需要开发者自己编写所源代码,尤其是对一些已经存在在库中的组件,这就需要个人自己编代码来设置组件的属性,从而开发人员的工作量就会大大增加。又因为界面只有在整个代码运行编译后才能看见,所以这种方法对工作中的互动与发展速度产生不利影响。

本论文电子词典的设计与实现利用了这两种方法的结合体,而且事实验证表明,巧用纯编码和Qt designer的结合体可以很大的提高效率与速度。

4.3 电子词典的界面设计与实现

图形用户界面的编码是一件工作量非常大的事情,前面我们已经提到Qt/Embedded可以提供一个非常好的工具,它有自身的特点。Qt系统特定的界面开发工具是Qt Designer,它只是提供一个可视化界面编辑器不包括任何编辑器。Qt Designer将编辑完成的界面以XML其保存为.ui文件,然后由专用的uic界面编译器将其转换为标准c++的源文件。在Qt

Designer中,我们可以拖动或通过点击的方式,适当的在空白表单添加一些输入框和按钮等小部件。这样Designer工具可以自动编写和维护代码。利用Qt Designer对C++程序进行编制的具体操作如下是:

(1) 窗口的建立,并且根据应用的需要添加控件在窗体中。Qt将会把窗口的建立保存为.ui文件;

(2) 使用Qt提供的uic工具将.ui文件转换为.h和.cpp文件,控制的动作则需要手动添加。

(3) 应用程序建立.pro工程文件需要使用program工具,工程建立Makefile文件利用tmake工具为主。

- 11 -

(4) 运行make,即可得到所需的可执行文件。

为了使用户操作方便简洁,在电子词典的界面设计时在一个窗口中设计了几个标签,每个标签是一个功接口,里面包括行文本框、按钮、编辑框等。

4.4 电子词典的功能设计与实现

4.4.1 系统的功能模块图

添加单词

主界面

加入生词本

进入生词本 退出

编辑单词

删除单词 保存单词

图4.1 系统的功能模块图

(1)主界面模块:进行生词加入生词本、进入生词本、以及退出程序。

(2)加入生词本:加入一个生单词,并进行保存。

(3)进入生词本:对加入的生单词进行详细的解释。

(4)添加单词:对新单词进行添加。

(5)编辑单词:对已经添加过的单词进行重新编辑。

(6)删除单词:对没用或者已经很少用到的单词进行删除操作。

(7)保存单词:对新添加的生单词或编辑过的旧单词进行保存。

4.4.2 功能的实现步骤

具体实现上述功能需要具备单词词库、Qt/Embedded开发环境、SQLite。具体实现步骤如下:

1. 创建数据库文件

大多数SQL数据库引擎是作为一个单独的服务终端进程被执行。使用数据库SQLite时,如果需要访问数据库中的程序,我们直接可以从磁盘中的数据库文件里读写,没有中 - 12 -

间的服务终端进程。所以,我们在调用数据库SQLite时必须创建数据库文件,依据数据库的特点,我们可以根据以下的过程进行创建数据库文件:

(1) 调用SQLite的函数sqlite3 open()创建一个数据库文件

(2) 创建表。在英语词典中通常需要具备英语单词、单词的解释这几项,所以在此需要创建一个words表。

(3) 将词库倒入数据库文件。在倒入时是以行为单位读取的,每一行的“单词、解释”都是用空格分隔。最后调用函数即可创建一个完整的数据库文件。

若上面这三步完成后,我们就成功的建立起数据库文件,这将为后面的章节奠定了扎实的基础。

2. Qt/Embedded与SQLite的连接

我们可以通过对Qt designer设计的界面编译后生成的.cpp文件和工程文件的修改的方法来实现Qt/Embedded与SQLite的连接。虽然这种方法比较容易于实现,但是利用这种方法效率会大大的降低以及应用程序的易用性和可读性,对于嵌入式应用程序的可移植性大大降低。本文采取面向对象的编程思想和中间件意识形态之间的连接。

整个过程实际是用SqliteProcess这个类对SQLite本身进行抽象,在这里不再详述整个程序的代码。这样的好处在于:

(1) 可扩展性良好;

(2) 系统的质量及可维护性得到了提高;

(3) 可移植性好,其它的数据库也方便使用;

(4) 简化整个程序。

若果Qt/Embedded与数据库SQLite连接后,电子词典的基本功能就可以通过嵌入式系统的信号与槽机制来实现。

先定义了三个成员函数connect()在查询中,其分别是:

connect(ListBoxWords,SIGNAL(highlighted(const QString&)),this,SLOT(ListBoxWordsClickSlot(const QString&)));

connect(PBtSearch,SIGNAL(clicked()),this,SLOT(PBtSearchPress()));

connect(LineEditInput,SIGNAL(textChanged(const QString&)),this,SLOT(1ineEditChangeSlot(const QString&)))。

第一个函数是在组件编辑框中点击某个单词。槽的设计中是想点击表中的单词,如果匹配只在文本框里显示其意思。该函数实现思想也与前面的槽设计相类似。使用以上几个 - 13 -

函数,我们就可以实现词语的查找功能。

第二个函数是点击图形界面中的查询按钮组件发送信号,由一开始定义的槽PBtSearchPress()来接收信号。整个槽函数的实现思想是执行语句SQL获得数据的行和列,用行和列的乘积配置循环查找结束条件,如果输入的内容与从数据库里找到的内容匹配,就将与它相对应的意思显示到文本框中。槽的设计中是在组件编辑框中输入单词点击查询按钮,将相对应单词意思显示在文本编辑框中。

第三个函数是在组件编辑框中输入,槽的设计中是列表编辑框的内容随着行编辑框的内容变化而变化。此函数的主要功能是插入内容到列表中。它实现的思想与前一个槽函数的实现相似。

为了使用户使用的更加方便,我们还为之设计了索引功能。我们可以输入一个单词的开头字母,通过索引查找自己想要的单词。这个设计主要是方便于单词记得不太熟的用户,这样既可以查到你所要的单词,也会节约很多宝贵的时间。

- 14 -

第5章 系统的界面实现

5.1 主界面

主界面是系统的首页面,在此页面能够直接进行生词的添加,也可以进入到进入生词本模块进行生单词的添加,此页面还可以通过网络在线词库索引实现英汉查询等操作。具体界面如下图5.1所示。

图5.1 系统主界面

5.2 生词本界面

生词本界面是主要进行生单词的添加,包括添加的生单词,所添加的生单词的解释,以及添加生单词的具体时间。在此页面下可以进入到添加单词界面进行具体的生单词的添加。具体界面如下图5.2所示。

- 15 -

图5.2 生词本界面

5.3 添加单词界面

添加单词界面主要是进行生单词的添加,包括具体的生单词,以及生单词的详细解释。还可以对新添加的生单词进行保存和清空等操作。具体界面如下图5.3所示。

图5.3 添加单词页面

5.4 编辑单词界面

编辑单词界面主要是对添加过的单词进行更新以及修改的操作,此外还可以清除本 - 16 -

页面上正在编辑的单词。具体界面如下图5.4所示。

图5.4 编辑单词页面

- 17 -

第6章 电子词典设计中遇到的问题

6.1 设计中文查询功能的问题

前面我们主要讲英汉查询的实现方法,顺理成章我们考虑汉英查询的功能,按理说英汉查询和汉英查询相类似,但是我们需要解决的问题是如何识别汉语输入以及输入的内容与数据库中的内容相匹配。

我们可以把中英文的查询设计放到同一个页面,这样可以让用户使用起来比较方便。所以我们应该对查询的时候,判断数据类型是否与之匹配。如果有ASCII码值和空格存在于数据中,则表示文本框中输入的是英文。假使完全没有ASCII码值和其他字符在数据库中,则表示文本框中输入的是中文。若以上问题解决掉,我们就可以实现中文查询功能。经过指导老师的帮助在最后终于实现。

6.2 音标正确显示的实现

在我们日常生活中,我们所见到的电子词典在汉译英查询时,在英文出现的同时后面会出现英文单词的音标。所以音标对于电子词典设计来说也是非常重要的。因为由于在Qt/Embedded中对于一些词组无法识别音标,这就需要我们进一步研究和探讨。这里不再详述,今后定会实现这一功能。

- 18 -

第7章 总结

通过这段时间准备毕业设计,使我学到了很多以前没有学过的知识,也体会到很多。首先,我明白其实认真学习一门语言并不困难,关键是寻找好的学习方法和途径。一种好的学习方法能便于快速掌握,熟练运用语言。其次,所谓好程序是要符合各种严密要求的。可读性、容错性、可维护性、高效性等要求。其实大部分功能是比较容易实现的,但其后的测试、修改、完善、注释和现在的编写系统文档要用不少的时间。再次,这次的程序训练培养了我们实际分析问题、编程和动手能力,使我们掌握了程序设计的基本技能,提高了我们适应实际,实践编程的能力。最后,我明白了编程是需要细心和耐心的,特别是在调试的时候,查找错误是很麻烦的,所以我们要养成一个良好的编程习惯,注意标明注释。程序设计是一件很复杂的事情,需要我们耐心的对待。在程序设计过程中有一些我们没学过的知识,但大部分我们学过,那些没学过的知识我们只要看下书就很容易弄明白。

在本次电子词典设计与实现的过程中遇到了很多问题,首先由于个人能力有限,对C++编程不熟悉,对于许多的算法和数据库不够熟悉,许多标准对话框不了解,导致在运行过程中遇到了很大的困难。比如C语言编程的程序与Qt界面链接不起来。经过老师的指导与帮助,在最后紧要时刻才实现链接。

这次论文主要以电子词典的设计与实现为主,在算法上面引用了数据库的B+树索引机制,借鉴了嵌入式数据库SQLite的优点。改进了SQLite的B+树索引机制,改善了空间利用率低的问题。最后利用改进后的索引机制的SQLite与Qt/Embedded结合来设计与完成电子词典。具体的工作总结如下:

(1) 通过对电子词典的设计,了解了很多关于电子词典的知识。由于所学知识不精,也遇到了一些难以解决的问题。

(2) 在嵌入式数据库SQLite中,在研究与改进B+树索引机制的的基础上,也研究了如何解决B树的索引机制空间利用率较低的问题,分析了改进B+树索引机制的主要实现思想,为本论文的实现奠定了扎实的理论基础。

(3) 深入的学习和研究了Qt/Embedded和SQLite的各种开发技术,为电子词典的设计与实现奠定了理论基础。我们还分析了电子词典的开发与运行环境、数据库文件的创建、用Qt designer进行界面设计、Qt/Embedded和SQLite的连接以及应用程序功能的实现。

- 19 -

参考文献

[1] 丁蓉.嵌入式数据库技术研究[D].西北工业大学,2002.

[2] D -RTDBMS.A Real-time Database Management cal Report

PRISTG-93-011[M],1994.1~6.

[3] 陈霞.“小金灵”移动数据库同步机制的设计与实现[D].中国人民大学,2001.

[4] 祁献鹏.基于嵌入式Qt中文GUI平台的设计[D].解放军信息工程大学,2002.

[5] 徐广毅,张晓林.嵌入式Linux系统中GUI系统的研究与移植.单片机与嵌入式系统应用[J],2004.11~14.

[6] 薛贺.嵌入式数据库技术研究[D].西北工业大学,2002.

[7] Trolltech Qt//Embedded White Paper[M],2003.192~196.

[8] Yasushi stic Replication Algorithms[M].Teeh Report Universty of Washington,2000.11~14.

[9] 解超,李善平.基于Linux的嵌入式GUI.计算机工程与应用[M],2003.135~139.

[10] E Pitoura,B ng Transaction Concepts for Mobile ding of The IEEE

Workshop on Mobile System and [M],1994.164~167.

[11] 徐广毅,张晓林,崔迎炜等.Qt/Embdedde在嵌入式Linux系统中的应用[M].单片机与嵌入式系统,2004.14~17.

[12] 倪继利.Qt及Linux操作系统窗口设计[M].(北京)电子工业出版社,2006.132~137.

[13] G D Walbom,P K ction Processing in ding of 1999 ACM

Symposium on applied computing[M],1999.149~162.

[14] 王存健,张建正.嵌入式Linux下Qt/Embedded的应用[J].计算机技术与发展,2006,16(11):197~18l.

[15] Q Lu,M ion-Only Transaction for Mobile Computing.Operating Systems

Review[J],1981,28(2):81~87.

[16] 何新贵,唐常杰,李霖等.特种数据库技术[M].(北京)科技出版社,2001.37~80.

[17] G D Walbom,P K ting Semantics—Based Transaction Processing in Mobile Database

ding of 14 IEEE Symposium on Reliable s[M],1955.31~40.

[18] L H Yeo,A sion of Transactions from Mobile Computers in a Cooperative

Multidatabase Processing dings of IEEE/CS 14 International Conference on Distributed

Computing [M],1994.372~379.

[19] Lockheed Martin Speed RTDB Usr’s

Guide(Version2.2).www.lockheedmartin.Com[M],1998.1~6.

[20] S F Andler,J Overview of DeeDS Real-Time Database Architecture Special Issue on Real

Time Database Record[M],1996.1~8.

- 20 -

致谢

通过这次设计,在理论学习中,很少有机会能有实践的机会,但我们可以,而且设计也是一个团队的任务,一起的工作可以让我们有说有笑,相互帮助,配合默契,多少人间欢乐在这里洒下,同时我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。设计过程中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。对我们而言,知识上的收获重要,精神上的丰收更加可喜。挫折是一份财富,经历是一份拥有。这次设计必将成为我人生旅途上一个非常美好的回忆!

通过这次设计使我懂得了理论与实际相结合是很重要的,如果我们只学到理论知识而不去实践的话,我们还是不会收货很多。从大一到现在,我始终秉着学习第一的信念,同时也获得不少成就。从大三下半学期我开始为考研做准备,打四这一年我感谢基地的老师以及学校的老师对我们的厚爱。给我们充足的时间备战,如果没有用你们的支持与帮助,我们也不会顺利考上研究生。所以在做毕设的时候我们本来就比别的学生学得少,对以前所学过的知识理解得不够深刻,掌握得不够牢固,都是基地的老师耐心的为我们指导。

这次毕业设计终于顺利完成了,在设计中遇到了很多专业性知识问题,最后在指导老师及同学的帮助下,终于迎刃而解。在毕业设计完成之际,我要感谢所有帮助过我的老师和同学,是你们给了我这么多的启发、指导,如果没有你们的帮助我很难完成这次设计。在这一年的实训过程中我受益匪浅。不管是在学习上还是在生活中,让我这个还未毕业的学生经历了一些在社会上的事情,这一年的经历我永生难忘。最后再次对那些帮助过我的老师表示感谢。

- 21 -

附录

1 外文资料翻译

Qt —— 一个跨平台的应用程序和用户界面开发框架

Qt是一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,KDE是所有主要的Linux发行版的一个标准组件。Qt支持下述平台: MS/Windows - 95、98、NT 4.0、ME、2000、XP 和 Vista,Unix/X11 - Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX和其它很多X11平台 Macintosh - Mac

OS X Embedded - 有帧缓冲(framebuffer)支持的Linux平台,Windows CE。Qt是诺基亚公司的一个产品。Qt开源版是Qt仅仅为了开发自由和开放源码软件, 提供了和商业版本同样的功能。GNU通用公共许可证下,它是免费的。最新的版本可以在这里下载。从2009年5月11日起,诺基亚Qt Software 宣布 Qt源代码库面向公众开放,Qt 开发人员可通过为 Qt 以及与 Qt 相关的项目贡献代码、翻译、示例以及其他内容,协助引导和塑造 Qt未来的发展。 在推出开放式 Qt 代码库的同时,Qt Software 在其官方网站发布了其产品规划(Roadmap)。其中概述了研发项目中的最新功能,展现了现阶段对 Qt 未来发展方向的观点,以期鼓励社区提供反馈和贡献代码,共同引导和塑造 Qt 的未来。Qt 4.6 首次包含了对Symbian 平台的支持,并在其所支持的平台中新增了 Windows 7、Apple Mac OS

10.6 (雪豹) 和即将上市的Maemo 6。Qt 对 Symbian 和 Maemo 的支持首次为开发人员创造了使用同一代码库同时针对这两个平台进行开发的机会。能够跨平台分享代码就意味着开发人员所开发的应用程序上市的速度将更快,影响的设备用户群将更广。Qt Mobility项目下的全新Qt API技术预览版也于今日同时发布。这些跨平台的API为开发人员提供了多种功能,如导航类设备的定位功能,以及信息发送和接收、联系人和网络连接管理等。Qt

4.6是在4.5图形增强功能的基础上创建的,进一步强化了这些图形功能,添加了全新的动画框架(Animation Framework)——包括直观的状态机功能——以及全新的高级图形功能,如不透明、阴影、闪光和滤镜等。在发布 Qt 4.6 的同时,作为 Qt 开发跨平台 IDE 的 Qt

Creator 也发布了更新版本。Qt Creator 1.3 和 Qt 4.6共同构成的 Qt SDK,包含了开发跨平台应用程序所需的全部功能。Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file, I/Odevice, directory

management, date/time 类。甚至还包括正则表达式的处理 功能。XML 支持。Webkit 引擎的集成,可以实现本地界面与Web内容的无缝集成。但是真正使得 Qt 在自由软件界的众多 Widgets (如 Lesstif,Gtk,EZWGL,Xforms,fltk 等等)中脱颖而出的还是基于 Qt 的重量级软件 KDE 。

- 22 -

2 外文资料原文

Qt cross-platform application development and UI framework. Qt is a cross platform C++ graphical user

interface application framework. It provides application developers to build a state-of-the-art graphical user

interface functionality required by. Qt is fully object oriented, and is easy to extend, and allows the real

component programming. It has become a worldwide thousands of successful application based. Qt is also

popular Linux desktop environment based KDE, KDE is all of the major Linux edition of a standard

component. Qt supports the following platforms: MS/Windows - 95,98, NT 4, ME,2000, XP and

Vista,Unix/X11- Linux, Sun Solaris, HP-UX, Compaq Tru64UNIX, IBM AIX, SGI IRIX and many other

X11platform Macintosh - Mac OS X Embedded - frame buffer ( framebuffer ) to support the Linux platform,

Windows CE. Nokia Qt is a product of the company. Qt open source version is Qt only in order to develop free

and open source software, provides the commercial version of the same function. The GNU general public

license, it is free. The latest version can be downloaded here. From May 11, 2009 onwards, Nokia Qt Software

announced the Qt source code library open to the public, Qt developers through the Qt and Qt projects related

to contribute code, translation, sample and other content, to guide and shape the future development of Qt. In

the introduction of open Qt code library at the same time, Qt Software in its official website announced their

product planning ( Roadmap ). The overview of the research and development project of new function, show

the stage directions for future development of Qt point of view, in order to encourage the community to

provide feedback and contribute code, to guide and shape the future of Qt. Qt 4.6includes the first support for

the Symbian, and in its supporting platform added Windows 7, Apple Mac OS 10.6( snow leopard ) and the

upcoming Maemo6. Qt on Symbian and Maemo support for developers created using the same code library at

the same time, the two platform for the development opportunities. Able to cross the platform to share code

means that developers to develop applications listed speed will be faster, effect of the device user group will be

wider. Qt Mobility project under the new Qt API technology preview was released at the same time in today.

These cross platform API provides developers with a variety of functions, such as navigation equipment

localization function, and information transmitting and receiving, contacts and network connection

management. Qt 4.6 is in the 4.5 graphical enhancements on the basis of the creation, and further strengthen

the graphics function, adding new animation framework ( Animation Framework ) -- including intuitive state

machine function -- as well as a new advanced graphics functions, such as opaque, shadow, flash and filter.

The release of Qt4.6, Qt development as cross platform IDE Qt Creator also released an updated version. Qt

Creator 1.3and Qt 4.6together constitute the Qt SDK, including the development of cross-platform applications

for all of the functions. Qt good encapsulation mechanism makes Qt modular degree is high, can be reused, for

users development is very convenient. Qt provides a safe type called signals/slots instead of callback, which

makes each element of collaborative work between becomes very simple. Qt includes up to 250 more than

C++, also provides a template based collections, serialization, file, I/Odevice, directory management, date/time.

Even a regular expression processing function. XML support. Webkit engine, can achieve the local interface

with Web content integration. But what makes the Qt in the free software world many Widgets ( such as

Lesstif, Gtk, EZWGL, Xforms, fltk etc.) in the talent showing itself is based on Qt heavyweight software

KDE.

- 23 -

3程序代码

#include "class_check.h"

#include "class_addword.h"

//#include "class_mewword.h"

#include

int main(int argc, char **argv)

{

QApplication app(argc, argv);

QTextCodec *code = QTextCodec::codecForName("gbk");

QTextCodec::setCodecForCStrings(code);

Mycheck win;

();

return ();

return 0;

}

class_

#include "class_addword.h"

MyAddWord::MyAddWord()

{

labword = new QLabel("单词");

explain = new QLabel("解释");

editword = new QLineEdit;

editexplain = new QTextEdit;

confirm = new QPushButton("确认");

clear = new QPushButton("清除");

cancel = new QPushButton("取消");

QHBoxLayout *layout1 = new QHBoxLayout;

layout1->addWidget(labword);

QHBoxLayout *layout2 = new QHBoxLayout;

layout2->addWidget(editword);

layout2->addWidget(clear);

QHBoxLayout *layout3 = new QHBoxLayout;

layout3->addWidget(explain);

QHBoxLayout *layout4 = new QHBoxLayout;

layout4->addWidget(editexplain);

QHBoxLayout *layout5 = new QHBoxLayout;

layout5->addWidget(confirm);

layout5->addWidget(cancel);

- 24 -

QVBoxLayout *layout = new QVBoxLayout;

layout->addLayout(layout1);

layout->addLayout(layout2);

layout->addLayout(layout3);

layout->addLayout(layout4);

layout->addLayout(layout5);

this->setLayout(layout);

setWindowTitle("添加单词");

connect(confirm, SIGNAL(clicked()),this,SLOT(myconfirm()));

connect(clear, SIGNAL(clicked()), this, SLOT(myclear()));

connect(editword, SIGNAL(textChanged(const QString &)), SLOT(myaddword(const QString &)));

connect(cancel, SIGNAL(clicked()),this, SLOT(close()));

QIcon qi("");

setWindowIcon(qi);

}

void MyAddWord::myclear()

{

editword->setText("");

editexplain->setPlainText("");

}

void MyAddWord::myaddword(const QString & text)

{

QString line,strDisplay;

int flag = 0;

QString strSearch = editword->text();

QFile file("");

if (!(QFile::ReadOnly))

return;

QTextStream in(&file);

line = ne();

while(!())

{

if (e(strSearch) == 0)

{

flag = 1;

}

- 25 -

line = ne();

if (flag == 1)

{

if (line != "*")

{

(line);

('n');

}

else

{

editexplain->setPlainText(strDisplay);

break;

}

}

else

{

editexplain->setPlainText("");

}

}

}

void MyAddWord::myconfirm()

{

emit myNewWord(editword->text(), editexplain->toPlainText ());

}

class_

#include "class_check.h"

Mycheck::Mycheck()

{

editSearch = new QLineEdit;

editText = new QTextEdit;

editText->setReadOnly(true);

btnSearch = new QPushButton("查一下");

btnAddNewWord = new QPushButton("加入生词本");

btnNewWord = new QPushButton("进入生词本");

btnQuit = new QPushButton("退出");

QHBoxLayout *layout1 = new QHBoxLayout;

layout1->addWidget(editSearch);

layout1->addWidget(btnSearch);

- 26 -

QHBoxLayout *layout2 = new QHBoxLayout;

layout2->addWidget(editText);

QHBoxLayout *layout3 = new QHBoxLayout;

layout3->addWidget(btnAddNewWord);

layout3->addWidget(btnNewWord);

layout3->addWidget(btnQuit);

QVBoxLayout *layout = new QVBoxLayout;

layout->addLayout(layout1);

layout->addLayout(layout2);

layout->addLayout(layout3);

this->setLayout(layout);

setWindowTitle("英汉词典");

connect(editSearch, SIGNAL(textChanged(const QString &)), this, SLOT(slotSearch(const QString &)));

connect(this, SIGNAL(addNewWord(const QString & , const QString &)), &NewWord,

SLOT(slotAddNewWord(const QString & , const QString &)));

connect(btnAddNewWord, SIGNAL(clicked()), this, SLOT(slotNewWord()));//send message

connect(btnQuit, SIGNAL(clicked()),qApp, SLOT(quit()));

connect(btnNewWord, SIGNAL(clicked()), this, SLOT(sendNewWord()));//display show

QIcon qi("");

setWindowIcon(qi);

}

void Mycheck::slotSearch(const QString & text)

{

QString line,strDisplay;

int flag = 0;

QString strSearch = editSearch->text();

QFile file("");

if (!(QFile::ReadOnly))

return;

QTextStream in(&file);

line = ne();

//modify

/*

while(!())

{

if (() == text)

{

(line);

('n');

}

line = ne();

- 27 -

}

editText->setPlainText(strDisplay);

*/

while(!())

{

if (e(strSearch) == 0)

{

flag = 1;

}

line = ne();

if (flag == 1)

{

if (line != "*")

{

(line);

('n');

}

else

{

editText->setPlainText(strDisplay);

break;

}

}

else

{

editText->setPlainText("");

}

}

}

void Mycheck::slotNewWord()

{

emit addNewWord(editSearch->text(), editText->toPlainText ());

}

void Mycheck::sendNewWord()

{

();

}

class_

#include "class_edit.h"

MyEditWord::MyEditWord()

{

labedit = new QLabel("单词");

- 28 -

explain = new QLabel("解释");

editword = new QLineEdit;

editword->setReadOnly(true);

editexplain = new QTextEdit;

confirm = new QPushButton("确认");

clear = new QPushButton("清除");

cancel = new QPushButton("取消");

QHBoxLayout *layout1 = new QHBoxLayout;

layout1->addWidget(labedit);

QHBoxLayout *layout2 = new QHBoxLayout;

layout2->addWidget(editword);

layout2->addWidget(clear);

QHBoxLayout *layout3 = new QHBoxLayout;

layout3->addWidget(explain);

QHBoxLayout *layout4 = new QHBoxLayout;

layout4->addWidget(editexplain);

QHBoxLayout *layout5 = new QHBoxLayout;

layout5->addWidget(confirm);

layout5->addWidget(cancel);

QVBoxLayout *layout = new QVBoxLayout;

layout->addLayout(layout1);

layout->addLayout(layout2);

layout->addLayout(layout3);

layout->addLayout(layout4);

layout->addLayout(layout5);

this->setLayout(layout);

setWindowTitle("编辑单词");

// connect(&word1, SIGNAL(editfrom(const QString &, const QString &), this, SLOT(editto(const QString

&, const QString &)));

connect(confirm, SIGNAL(clicked()),this,SLOT(myconfirm()));

connect(clear, SIGNAL(clicked()), this, SLOT(myclear()));

connect(cancel, SIGNAL(clicked()),this, SLOT(close()));

QIcon qi("");

setWindowIcon(qi);

}

void MyEditWord::myclear()

{

- 29 -

editword->setText("");

editexplain->setPlainText("");

}

void MyEditWord::editto(const QString & str1, const QString &str2)

{

editword->setText(str1);

editexplain->setPlainText(str2);

}

void MyEditWord::myconfirm()

{

QDate qdate = tDate();

QString strDate = ng("yyyy年MM月dd日");

emit fromEditWord(editword->text(), editexplain->toPlainText(), strDate);

}

class_

#include "class_newword.h"

MyNewWord::MyNewWord()

{

tableWidget = new QTableWidget(0, 3, this);

btnAdd = new QPushButton("添加");

btnEdit = new QPushButton("编辑");

btnDelete= new QPushButton("删除");

btnSave = new QPushButton("保存");

lblWord = new QTableWidgetItem("单词");

lblExplain= new QTableWidgetItem("解释");

lbltimer= new QTableWidgetItem("添加时间");

tableWidget->setHorizontalHeaderItem(0,lblWord);

tableWidget->setHorizontalHeaderItem(1,lblExplain);

tableWidget->setHorizontalHeaderItem(2,lbltimer);

QHBoxLayout *layout1 = new QHBoxLayout;

layout1->addWidget(tableWidget);

QHBoxLayout *layout2 = new QHBoxLayout;

layout2->addWidget(btnAdd);

layout2->addWidget(btnEdit);

layout2->addWidget(btnDelete);

layout2->addWidget(btnSave);

QVBoxLayout *layout = new QVBoxLayout;

layout->addLayout(layout1);

layout->addLayout(layout2);

- 30 -

this->setLayout(layout);

setWindowTitle("单词本");

connect(this, SIGNAL(editfrom(const QString &, const QString &)), &editword, SLOT(editto(const QString

&, const QString &)));

connect(&addWord, SIGNAL(myNewWord(const QString & , const QString &)), this,

SLOT(slotAddNewWord(const QString & , const QString &)));

connect(&editword, SIGNAL(fromEditWord(const QString &, const QString &,const QString &)), this,

SLOT(toEditWord(const QString &, const QString &,const QString &)));

// connect(btnEdit, SIGNAL(editfrom(const QString &, const QString &), &editword, SLOT(editto(const

QString &, const QString &)));

connect(btnAdd, SIGNAL(clicked()), this, SLOT(slotAdd()));

connect(btnEdit, SIGNAL(clicked()), this, SLOT(slotEdit()));

connect(btnSave, SIGNAL(clicked()), this, SLOT(slotSave()));

connect(btnDelete, SIGNAL(clicked()),this, SLOT(slotDelete()));

QIcon qi("");

setWindowIcon(qi);

/* read file */

QString line,strDisplay;

QFile file("");

if (!(QFile::ReadOnly))

return;

QTextStream in(&file);

line = ne();

while(!())

{

int i = tableWidget->rowCount();

tableWidget->setRowCount(++i);

QTableWidgetItem *iter1, *iter2, *iter3;

iter1 = new QTableWidgetItem(line);// qDebug()<<"-----"<

tableWidget->setItem(i-1, 0, iter1);

line = ne();

while (line != "*" )//&& !())

{

(line);

('n');

line = ne();

}

iter2 = new QTableWidgetItem(strDisplay);// qDebug()<<"-----"<

- 31 -

tableWidget->setItem(i-1, 1, iter2);

strDisplay="";

if(line == "*")line = ne();

iter3 = new QTableWidgetItem(line); // qDebug()<<"-----"<

tableWidget->setItem(i-1, 2, iter3);

line = ne();

if(line == "*")line = ne();

}

}

void MyNewWord::toEditWord(const QString & str1, const QString &str2, const QString &str3)

{

int j = 0, i = tableWidget->rowCount();//获取表格当前的行数

for(j = 0; j< i; j++)

{

QTableWidgetItem * cell = tableWidget->item(j, 0);

if(cell == NULL)

{

break;

}

QString str = cell->text();

if(str == str1)

{

QTableWidgetItem *iter2, *iter3;

iter2 = new QTableWidgetItem(str2);

iter3 = new QTableWidgetItem(str3);

tableWidget->setItem(i-1, 1, iter2);

tableWidget->setItem(i-1, 2, iter3);

break;

}

}

}

void MyNewWord::slotAdd()

{

();

}

void MyNewWord::slotAddNewWord(const QString & s1, const QString & s2)

{

int j = 0,i = tableWidget->rowCount();//获取表格当前的行数

for(j = 0; j< i; j++)

{

QTableWidgetItem * cell = tableWidget->item(j, 0);

if(cell == NULL)

- 32 -

{

break;

}

QString str = cell->text();

if(str == s1)

{

QMessageBox box(QMessageBox::Information,"提示","单词已添加!");

();

break;

}

}

if(j == i)

{

if(s1 == "")

{

return;

}

tableWidget->setRowCount(++i);

date = tDate();

QTableWidgetItem *iter1, *iter2, *iter3;

QString strDate = ng("yyyy年MM月dd日");

iter1 = new QTableWidgetItem(s1);

iter2 = new QTableWidgetItem(s2);

iter3 = new QTableWidgetItem(strDate);

tableWidget->setItem(i-1, 0, iter1);

tableWidget->setItem(i-1, 1, iter2);

tableWidget->setItem(i-1, 2, iter3);

/*禁止表格被编辑*/

tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

//table->setStyleSheet("QTableView::Item{background-color:#FF3EFF}");

tableWidget->setStyleSheet("QTableView{background-color:deeppink}");

}

}

void MyNewWord::slotEdit()

{

int row = tableWidget->currentItem()->row();

QTableWidgetItem *getitem1 = tableWidget->item(row, 0);

QTableWidgetItem *getitem2 = tableWidget->item(row, 1);

QString str1 = getitem1->text();

QString str2 = getitem2->text();

emit editfrom(str1, str2);

- 33 -

();

}

void MyNewWord::slotDelete()

{

int line = tableWidget->rowCount();

/*如果单词本是空的,弹出警告*/

if(line == 0)

{

QMessageBox box(QMessageBox::Warning,"警告","生词本已经是空的!");

();

return;

}

tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);//允许选中多行

int row = tableWidget->currentItem()->row();

tableWidget->removeRow(row);

}

void MyNewWord::slotSave()

{

int j=0, i = tableWidget->rowCount();

QFile wfile("");

if(!(QFile::WriteOnly))

return ;

QTextStream in(&wfile);

while(j < i)

{

QTableWidgetItem *iter1, *iter2, *iter3;

iter1 = tableWidget->item(j, 0);

iter2 = tableWidget->item(j, 1);

iter3 = tableWidget->item(j, 2);

QString str1, str2, str3;

str1 = iter1->text();

str2 = iter2->text();

str3 = iter3->text();

in<

j ++;

}

}

- 34 -


发布者:admin,转转请注明出处:http://www.yc00.com/num/1707381416a1499617.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信