admin管理员组

文章数量:1532727

2024年7月13日发(作者:)

毕业设计(论文)

题 目:基于QT的图片浏览器

班 级:

14级物联网应用技术(5)班

学 生 学 号:

* * * 名:

***

指 导 教 师:

徐 行

江西应用工程职业学院

二〇一六年九月

目 录

摘 要............................................................... 1

Abstract ........................................................... 2

引 言 .............................................................. 3

1 嵌入式的前景 .................................................... 4

1.1 课题研究背景和意义 .......................................... 4

1.2 嵌入式软件技术发展现状与未来 ................................ 4

1.2.1 标志性的嵌入式产品已露头角............................. 4

1.2.2 嵌入式软件技术面临挑战................................. 4

1.2.3 影响未来的若干软件新技术............................... 5

1.3 课题研究内容 ................................................ 6

2 Linux和Qt简介 .................................................. 7

2.1 Linux主要特性............................................... 7

2.2 Qt开发工具简介.............................................. 7

2.2.1 Qt主要特性 ............................................ 7

2.2.2 Qt编程机制简介 ........................................ 8

3 嵌入式终端应用程序之电子相册架构设计 ........................... 11

3.1 记事本架构设计 ............................................. 11

3.1.1 记事本设计需求........................................ 11

3.1.2 记事本界面设计........................................ 12

3.1.3 记事本结构设计........................................ 15

3.1 电子相册架构设计 ........................................... 16

3.2.1 电子相册设计需求...................................... 16

3.2.2 电子相册界面设计...................................... 16

3.2.3 电子相册结构设计..................................... 19

4 算法设计和实现 ................................................. 20

4.1 记事本主要算法设计和实现 ................................... 20

4.1.1 记事本类结构设计...................................... 20

4.1.2 记事本功能实现........................................ 21

4.2 电子相册主要算法设计和实现 ................................. 25

1

4.2.1 电子相册类结构设计.................................... 25

4.2.2 电子相册功能实现...................................... 25

5 结 论 .......................................................... 31

参考文献 .......................................................... 32

致 谢.............................................................. 33

2

摘 要

随着社会进步的越来越快,电子商品每天都日新月异,数码相机

也越来越普及,我们可以更方便快捷地留下美好的瞬间。但是随着相

片的不断增加,使管理照片的难度也达到了一个新的高度为了让人们

更有效地管理、随时随地只要有网络就能够快速查询到不同时间、不

同地点所拍的照片,故而开发了这套电子相册统。另外这个电子相册

还包括图片的放大缩小等其他功能,使对照片的管理更加方便。

关键词:嵌入式;Qt开发;图形界面;电子相册;移植

1

Abstract

More and more embbeded Embedded Terminal need graphics user

interface(GUI). A good Human-Computer Interaction interface is the key technology

of embedded system design. Higher demands of the practicality, aesthetics and

audio-visual entertainment of embedded terminal are needed, especially in embbeded

system handheld device. Notepad and electronic photo album are becoming an

integral part of embedded device for their pracicality and good viewing. It has some

practical significance and value to develop a notepad and an album with beautiful

interface, rich functions and good interaction based on embedded terminal.

The aim of this paper is to design and implement a notepad and an album in the

embeded terminal environment. This paper presented the advantage of Linux and the

building of QT developing environment, focused on the programming mechanism of

developing software with Qt. It analysed the needs of the design, designed the specific

interface and overall structure of notepad and album in the embeded terminal

environment according to features of embedded project designed and

implemented the relevant functions of norepad(such as new file,open file ,edit file and

delete file) as well as the relevant functions of album(such as enlarge 、minify、 rotate

and move the picture) based on the algorithms of notepad and album. Finally, brief

disscusion about the further reaserch of this paper was presented.

Key words:Embedded Linux;Qt;GUI;notepad;album; explanted

2

引 言

随着嵌入式技术的发展,高科技产品逐渐向着小型化,智能化的方向发展。

嵌入式设备以其独有的小型、快速、功耗低等优势逐渐在各行各业有着迅速的成

长,产品包括新型手机、PDA、导航设备、信息家电等等。浏览器作为嵌入式设

备与网络对接的一个重要应用软件,在当今处于发展阶段,只有少数公司拥有自

主知识产权的嵌入式浏览器。因此,需要更多的关注和投入。

Qt作为Nokia公司的一个开源的源码包,自1996年以来,已成为世界范围

内数千种成功的应用程序基础,也是流行的Linux桌面环境KDE的基础。支持带

帧缓冲(framebuffer)的Linux平台(即一般的嵌入式系统所用操作系统平台)。

它是用C++编写的源代码,能够方便的跨平台移植。该源码包含了许多应用软件

应该涉及到的各种功能模块,为编写大型软件提供了有力的支持。

3

1 嵌入式的前景

1.1

课题研究背景和意义

随着嵌入式产品的发展,往往要求嵌入式操作系统有网络和图形的功能。利

用源代码开放的Linux搭建的嵌入式操作系统,由于强大的网络功能和低成本,

近来得到了越来越多的应用。其能够提供全功能的桌面计算,定制非常方便并且

支持大多数嵌入式系统上使用的芯片,包括Strong ARM,MIPS和Power PC等。

在嵌入式Linux操作系统上使用一个功能完备的轻量级、高性能、高可靠、可配

置的GUI系统成为可行的解决方案(丁丁,2004)。

虽然市场上现在已经有了众多的优秀的GUI应用软件,但随着近年来计算机

技术的迅速发展,当新硬件、新技术出现时,计算机的体系结构、指令系统和操

作系统都可能发生相应的改变,这势必会导致一部分应用软件在新环境下无法正

常运行。如果舍弃原有软件而重新开发,将会耗费大量的人力和资金,而且浪费

了许多成熟的软件成果。

而Qt在源代码级上实现了跨平台特性,极大的支持了跨平台通用软件的开

发。Qt可以用同一个源程序在不同平台上编译链接,生成目标代码,并取得相

同的运行效果,称为“一次编写,随处编译”,利用这种方法充分实现了程序的

跨平台运行。这种基于源代码的跨平台特性不仅解决了性能的问题,而且可以发

挥各个平台的优势,充分利用每个平台自身的特点;并且即可以在新环境下实现

原有软件的功能和特点,减少开发费用,还可以改进原有软件的不足,增加新的

需求,从而提高软件的质量,延长软件生命期。

因此,利用Linux下基于Qt的嵌入式终端应用程序开发是一个非常有意义

的课题,具有重要的研究和商业价值。

1.2

嵌入式软件技术发展现状与未来

1.2.1 标志性的嵌入式产品已露头角

全过程自动化产品制造、大范围电子商务活动、高度协同科学实验以及现代

化家庭起居,为嵌入式产品造就了崭新而巨大的商机。除了沟通信息高速公路的

交换机、路由器和Modem,构建CIMS所需的DCS和机器人以及规模较大的家用

汽车电子系统。最有量产效益和时代特征的嵌入式产品应数因特网上的信息家电

(Internet Appliances),如Web可视电话、Web游戏机、Web PDA(俗称电子商务、

商务通)、WAP电话手机、以及多媒体产品,如STB(电视机顶盒)、DVD播放机、

电子阅读机。

1.2.2 嵌入式软件技术面临挑战

以信息家电为代表的互联网时代嵌入式产品,不仅为嵌入式市场展现了美好

前景,注入了新的生命;同时也对嵌入式系统技术,特别是软件技术提出新的挑

4

战。这主要包括:支持日趋增长的功能密度、灵活的网络联接、轻便的移动应用

和多媒体的信息处理,此外,当然还需对付更加激烈的市场竞争。主要从以下几

个方面体现出来:

(1)嵌入式应用软件的开发需要强大的开发工具和操作系统的支持

随着因特网技术的成熟、带宽的提高,ICP和ASP在网上提供的信息内容日

趋丰富、应用项目多种多样。像电话手机、电话座机及电冰箱、微波炉等嵌入式

电子设备的功能不再单一,电气结构也更为复杂。为了满足应用功能的升级,设

计师们一方面采用更强大的嵌入式处理器如32位、64位RISC芯片或信号处理

器DSP增强处理能力;同时还采用实时多任务编程技术和交叉开发工具技术来控

制功能复杂性,简化应用程序设计、保障软件质量和缩短开发周期。

(2)联网成为必然趋势

为适应嵌入式分布处理结构和应用上网需求,面向21世纪的嵌入式系统要

求配备标准的一种或多种网络通信接口。针对外部联网要求,嵌入设备必需配有

通信接口,相应需要TCP/IP协议簇软件支持;由于家用电器相互关联(如防盗报

警,灯光能源控制,影视设备和信息终端交换信息)及实验现场仪器的协调工作

等要求,新一代嵌入式设备还需具备IEEE1394、USB、CAN、Bluetooth或IrDA

通信接口,同时也需要提供相应的通信组网协议软件和物理层驱动软件。为了支

持应用软件的特定编程模式,如Web或无线Web编程模式,还需要相应的浏览器,

如HTML、WML等。

(3)支持小型电子设备实现小尺寸、微功耗和低成本

为满足这种特性,要求嵌入式产品设计者相应降低处理器的性能,限制内存

容量和复用接口芯片。这就相应提高了对嵌入式软件设计技术要求。如,选用最

佳的编程模型和不断改进算法(孙琼,2004)。

(4)提供精巧的多媒体人机界面

嵌入式设备之所以为亿万用户乐于接受,重要因素之一是它们与使用者之间的

亲和力,自然的人机交互界面,如司机操纵高度自动化的汽车主要还是通过习惯

的方向盘、脚踏板和操纵杆。人们与信息终端交互要求以GUI屏幕为中心的多媒

体界面。手写文字输入、语音拨号上网,收发电子邮件以及彩色图形、图像已取

得初步成效。

1.2.3 影响未来的若干软件新技术

(1) 日趋流行的行业性开放系统和备受青睐的自由软件技术

为了对付日趋激烈的国际市场竞争势态,设计技术共享和软件重用、构件兼

容、维护方便和合作生产是增强行业性产品竞争能力的有效手段。走行业开放系

统道路是加快嵌入式软件技术发展的捷径之一。国际上自由软件运动的顺利发展,

5

GPL概念正对嵌入式软件产业深远影响。嵌入式Linux多种原型的提出,和GNU

软件开发工具软件的实用化进展,正为我国加快发展嵌入式软件技术提供了极好

机遇和条件。

(2) 无线网络操作系统初见端倪

未来移动通信网络不仅能够提供丰富的多媒体数据业务,而且能够支持更多

功能和更强的移终端设备。为了有效地发挥第三代移动通信系统的优势,许多设

备厂商针对未来移动设备的特点努力开发无线网络操作系统(M. Tim Jones,

2008)。

(3) IP构件库技术正在造就一个新兴的软件行业

嵌入式系统实现的最高形式是单一芯片系统(SOC,System On Chip),而SOC

的核技术是IP核(即知识产权核Intellectual Property Kernels)构件。IP核

有硬件核、软件核和固件核,硬件核主要指8/16/32/64位MPU核或DSP核。硬

件提供商以数据软件库的形式,将其久经验证的处理器逻辑和芯片版图数据,供

EDA工具调用在芯片上直接配置MPU/DSP功能单元;而软件核则是软件提供商将

SOC所需的RTOS内核软件或其它功能软件,如通信协议软件,FAX功能软件等构

件标准API方式和IP核构件形式供IDE和EDA工具调用制成FLASH或ROM可执

行代码单元,加速SOC嵌入式系统定制或开发。目前一些嵌入式软件供应商纷纷

把成熟的RTOS内核和功能扩展件,以软件IP核构件形式出售,如Microtec的

VRTXoc for ARM就是典型例子。正在兴启的IP构件软件技术正为一大批高智小

型软件公司提供发展机遇。

1.3

课题研究内容

针对嵌入式产品的高度个性化,其外观、与用户交互的界面千差万别的特点,

故而系统的设计目标是意在打造一个能在嵌入式终端运行、通用的、可以方便的

支持各种控件、各种图形格式,具有体积小、可裁剪、可移植的这样一个面向嵌

入式的应用程序系统,使各种嵌入式设备也同样能具有美观的用户界面,相对比

较丰富的功能,操作起来简单而又直观。

本文通过对嵌入式Linux和Qt的分析,在嵌入式Qt的基础上,开发了面向

嵌入式终端的 电子相册应用软件。记事本不仅支持英文输入和显示,而且支持

中文和日文的显示,还支持记事本文件的浏览、编辑、删除等功能。电子相册不

仅支持中、英、日文图片名字的显示,还支持如放大、缩小、旋转等各种方式下

的图片浏览。它们体积小,移植方便,适用于掌上电脑、智能电话及一些高端的

嵌入式设备中。此外它作为一种小型GUI解决方案,可用于那些对GUI大小要求

苛刻的各种应用系统中。

6

2 Linux和Qt简介

2.1 Linux主要特性

Linux是个和Unix相似、以Unix核心为基础、完全内存保护、多任务多进

程的操作系统。支持广发的计算机硬件,包括X86,Alpha,Sparc,MIPS,PPC,

ARM,NEC等现有的大部分芯片。程式源码全部公开,任何人可以修改并在GNU

通用公共许可证(GNU General Public License)下发行(陈英和梁建武,2008),

这样,开发人员可以对操作系统进行定制,再也不必担心像MS windows操作系

统中"后门"的威胁。同时由于有GPL的控制,大家开发的东西大都相互兼容,不

会走向分裂之路。Linux用户遇到问题时可以通过Internet向网上成千上万的

Linux开发者请教,这使最困难的问题也有办法解决。Linux带有Unix用户熟悉

的完善的开发工具,几乎所有的Unix系统的应用软件都已移植到了Linux上。

Linux还提供了强大的网络功能,有多种可选择窗口管理器(X windows)。其强

大的语言编译器gcc、g++等也可以很容易得到。不但成熟完善、而且使用方便,

为嵌入操作系统提供了一个极有吸引力的选择。

Linux已经被移植到多种硬件平台,这对受开销、时间限制的研究与开发项

目是很有吸引力的。原型可以在标准平台上开发然后移植到具体的硬件上,加快

了软件与硬件的开发过程。

Linux还有以下优点:

(1)Linux可以随意地配置,不需要任何的许可证或商家的合作关系。

(2)它是免费的,源代码可以得到。这是最吸引人的。毫无疑问,这会节省

大量的开发费用。

(3)它本身内置网络支持。

(4)Linux的高度模块化使添加部件非常容易。

(5)Linux在台式机上的成功,使大家看到了linux在嵌入式系统中的辉煌前

景。

嵌入式产品中选择什么样的操作系统极为重要,嵌入式Linux由于其开源特

性、实时性好、可移植、内置网络支持等优点在嵌入式领域成为主力军。如今,

业界已经达成共识:即嵌入式linux是大势所趋,其巨大的市场潜力与酝酿的无

限商机必然会吸引众多的厂商进入这一领域。

2.2 Qt开发工具简介

2.2.1 Qt主要特性

Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech公司开发,目前

包括Qt/X11、基于Framebuffer的Qt/Embedded、快速开发工具Qt Designer

7

以及国际化工具Qt Linguist等。人们所熟知的Linux下面的KDE环境就是基于

Qt开发而成的。Qt支持Unix和Linux系统以及Windows系统。

Qt的主要特点有: 面向对象, 很容易扩展, 并且允许真正的组件编程;

Qt对各个模块进行了良好的封装,使各模块可重用性较好;优良的跨平台特性,

使用Qt类编写的程序可以实现 “一次编码,到处编译”,极大的降低了跨平台

开发的难度(丁丁等,2004);构件支持, 对于对象间通信,Qt没有采用函数

回调的方法,而是采用了一种全新并且可选的被称为“信号与槽” 的对象间通

信机制,通过一个对象信号的发射,另一个槽函数的响应,使各个对象之间的通

信安全而且高效。 Qt的这些特点使它非常适合于真正的构件编程, 同时使各

个组件之间的协同工作变得十分简单,并且 Qt是直接基于 Xlib的,不依赖

Motif 工具包, 所以它的执行效率比一般的基于平台的代码的执行效率要高。

2.2.2 Qt编程机制简介

(1) Qt系统的信号与槽机制简介

信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同

的部分。在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知

给另一个窗口部件(张娟,张雪兰,2007)。更一般地,我们希望任何一类的对象

可以和其它对象进行通讯。

较老的工具包使用一种被称作回调的通讯方式来实现同一目的。回调是指一

个函数的指针,所以如果你希望一个处理函数通知你一些事件,你可以把另一个

函数(回调)的指针传递给处理函数。处理函数在适当的时候调用回调(倪继利,

2006)。回调有两个主要缺点。首先他们不是类型安全的。我们从来都不能确定

处理函数使用了正确的参数来调用回调。因此容易造成进程崩溃,另外一个问题

是,回调这种方式紧紧的绑定了图形用户接口的功能元素,因而很难把开发进行

独立的分类。

Qt的信号与槽机制是不同的。Qt的信号与槽均以函数形式出现,Qt的窗口

部件有很多预定义的信号,但我们也可以通过继承来加入我们自己的信号。槽就

是一个可以被调用处理特定信号的函数。Qt的窗口部件有很多预定义的槽,但

是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号。我

们可以用connect()函数对需要的信号和槽进行连接。当对象的内部状态发生改

变,信号就被发射。从某种意义上讲,它们也许对外面的世界感兴趣。这就是所

有的对象通讯时所做的一切。它不知道也不注意无论有没有东西接收它所发射的

信号。当一个信号被发射,它所连接的槽会被立即执行,就像一个普通函数调用

一样(见图1)。信号/槽机制完全不依赖于任何一种图形用户界面的事件回路。

当所有的槽都返回后发射的信号也将返回。信号与插槽机制并不要求类之间互相

8

知道细节,这样就可以相对容易的开发出代码可高重用的类(Matthias

Dalheimer,2002)。

信号和槽的机制是类型安全的:一个信号的签名必须与它的接收槽的签名相

匹配。(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额

外的签名。)因为签名是一致的,编译器就可以帮助我们检测类型不匹配。它以

警告的方式报告类型错误,而不会使系统产生崩溃。信号和槽是宽松地联系在一

起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号(Johan

Thelin,2007)。Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接

起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、

任何类型的参数。它们是完全类型安全的:不会再有回调核心转储(core dump)。

你可以把许多信号和你所希望的单一槽相连,并且一个信号也可以和你所期

望的许多槽相连。把一个信号和另一个信号直接相连也是可以的。(这时,只要

第一个信号被发射时,第二个信号立刻就被发射。)

总体来看,信号和槽构成了一个强有力的组件编程机制。

如果一个类要使用信号与槽机制,它就必须是从QObject或QObject的子类

继承,而且类的定义必须加上Q_OBJECT宏。signals、slots和emit是Qt特有

的关键字,分别用来表示信号、槽、和发送信号,移除这些关键字和预处理程序,

就可以使用标准的C++编译器。槽同其他函数一样也具有访问权限,只是槽的访

问权限决定了谁可以和它相连,如一个public slots:包含了任何信号都可以相

连的槽(Andrew Krause,2007) 。一个protected slots:包含了只有这个类和它

的子类的信号才能连接的槽。这就是说这些槽只是类的实现的一部分,而不是它

和外界的接口。 一个private slots:包含了只有这个类本身的信号可以连接的

槽,甚至它的子类都没有获得连接的权利。

图1 信号和槽的连接原理图

9

(2) Qt元对象系统

Qt中的元对象系统是用来处理对象间通讯的信号/槽机制、运行时的类型信

息和动态属性系统。它基于下列三类:QObject类、类声明中的私有段中的

Q_OBJECT宏、元对象编译器(moc)。

moc读取C++源文件。如果它发现其中包含一个或多个类的声明中含有

Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成另一个含有元对象代码的C++

源文件。这个生成的源文件可以被类的源文件包含(#include)到或者和这个类

的实现一起编译和连接。

除了提供对象间通讯的信号和槽机制之外(介绍这个系统的主要原因),

QObject中的元对象代码实现其它特征:

(1) className()函数在运行的时候以字符串返回类的名称,不需要C++编

译器中的本地运行类型信息(RTTI)的支持。

(2) inherits()函数返回这个对象是否是一个继承于QObject继承树中一

个特定类的类的实例。

(3) tr()和trUtf8() 两个函数是用于国际化中的字符串翻译。

(4) setProperty()函数和property()函数,这两个函数是用来通过名称

动态设置和获得对象属性的。

(5) metaObject()函数返回这个类所关联的元对象。

虽然使用QObject作为一个基类而不使用Q_OBJECT宏和元对象代码是可以

的,但是如果Q_OBJECT宏没有被使用,那么这里的信号和槽以及其它特征描述

都不会被提供。根据元对象系统的观点,一个没有元代码的QObject的子类和它

含有元对象代码的最近的祖先相同。举例来说就是,className()将不会返回你

的类的实际名称,返回的是它的这个祖先的名称。故强烈建议QObject 的所有

子类使用Q_OBJECT宏,而不管它们是否实际使用了信号、槽和属性(Jonathan

Corbet, 2005)。

10

3 嵌入式终端应用程序之电子相册架构设计

3.1 记事本架构设计

3.1.1 记事本设计需求

记事本可以将目录下的记事本文件以文件名列表的形式显示出来,并可以实

现记事本文件的新建、打开、编辑和删除等功能;记事本可以根据文件内容的多

少来实现文本的滚动显示,并可以通过软键盘对文本进行编辑等。

(1) 文件列表功能:记事本的文件列表用于显示记事本文件名,并且当

记事本文件名过长时进行文件名长度显示的控制。当文件数目多于当前界面显示

范围,则出现上下方向的滚动条,可以向上或向下滚动显示文件名。

(2) 文件名选中显示功能:在文件列表上被选中的文件名高亮显示。

(3) 新建文件功能:新建记事本文件时,提示输入文件名,如果没有输

入文件名而选择直接进入文件编辑界面,系统则提供默认的文件名用于存储文件。

编辑新建文件时,文件名在编辑界面上方显示。

(4) 控制文本编辑格式功能:编辑文件时,文本内容输入到当前界面的

右端边界处自动换行,也可以利用键盘操作执行换行动作。输入的文本内容多于

当前屏幕显示范围时出现纵向滚动条,随着文本输入滚动显示内容。保存文件后,

文件名立即显示在文件列表上。

(5) 打开文件功能:根据文件列表选择打开指定的文件,打开指定文件

时,显示打开文件的文件内容在文件编辑界面上,文件内容过多时可以滚动显示,

并在文件编辑界面的上方滚动显示打开的文件的文件名。

(6) 文件内容编辑和显示功能:在文件编辑界面上可以对文件的内容进

行编辑和修改。如果文件内容多于当前屏幕显示范围的话,出现纵向滚动条,可

以滚动显示当前文件的文件内容。

(7) 打开下一个文件功能:在当前打开文件列表界面,若选择“打开一

个文件”功能,则显示下一个文件的内容在文件编辑区。

(8) 文件内容修改提示功能:若在打开的文件中对其内容进行了修改,

在关闭文件时将会提示文件的内容已经被修改的消息,用户可选择是否保存修改

后的内容。

(9) 删除文件功能:可以在文件列表上对指定文件进行删除操作,也可

以打开文件后,对打开的文件进行删除操作。选择删除文件操作时,会出现确定

文件删除的提示,如果此时放弃删除操作,则文件不会被删除,否则文件将会被

彻底删除,即从物理设备上被删除。文件被删除后,文件列表上该文件名被移除。

11

(10) 软键盘输入功能:软键盘支持英文输入,Cap键支持大小写英文切

换,提供Shift键的上下字符切换功能,Enter可以进行回车换行,其ESC键执

行软键盘退出功能。软键盘上的按键与物理键盘的按键位置相对应。

给用户提供友好的图形用户界面,并合理安排界面元素布局,使其交互性

好且方便用户操作。

3.1.2 记事本界面设计

记事本主要界面设计:

(1) 文件列表界面:如图2所示,界面大小为320*240。界面上方提供记

事本图标和记事本文字标签,中间的显示区域显示记事本文件列表。界面的最下

方为两个按钮,左侧的是功能按钮,右侧的是返回按钮,此界面上分别标记为

“Option”和“Exit”。文件列表中文件以文件创建时间排序,将要进行操作的

文件名高亮显示。

图 1 文件列表界面

(2) 新建文件编辑界面:如图3所示,界面大小为320*240。界面上方显

示记事本图标和新建文件的文件名,如果没有输入文件名则不显示。中间的显示

区域为文件编辑区,用于接收文本的输入。界面的最下方左侧为功能按钮,右侧

的是返回按钮,此界面上分别标记为“Option”和“Save”。

12

图 2 新建文件编辑界面

(3) 打开文件内容显示界面:如图4所示,界面大小为320*240。界面上

方显示记事本图标和打开的文件的文件名,中间的显示区域为文件内容显示区,

可以接受文本的编辑和修改。界面的最下方左侧为功能按钮,右侧的是返回按钮,

此界面上分别标记为“Option”和“Back”。

图 3 文件打开界面

记事本功能菜单设计:

如图5所示,记事本功能菜单大小要小于记事本主要界面的大小,根据具体

条目的数量来调整为合适的大小。菜单上显示可操作的功能选项,并对选定的功

能选项高亮显示。界面的最下方左侧为功能按钮,右侧的是返回按钮,菜单中分

别标记为“Select”和“Back”。

13

图 4 功能菜单

记事本消息提示框设计:

如图6所示,消息提示框界面大小为320*160。消息提示框的显示区域显示

提示动画和提示的内容。界面的最下方左侧为功能按钮,右侧的是返回按钮,此

界面中分别标记为“Yes”和“No”。

图 5 消息提示框

相邻两个界面之间切换时,若后出现的界面大小小于先出现的界面大小,则

第一个界面显示蒙版即表示为禁用状态,如图5和图6。

记事本软键盘界面设计:

如图7所示,软键盘需要对文本编辑区进行输入操作,所以软键盘界面尽量

要小一些,以免影响了文本编辑区的使用,但同时也需要保证软键盘上字符的清

晰显示,故软键盘界面大小为设定为320*130。按键布局与物理键盘基本一致,

按键布局美观,同时键盘的边缘相对宽一些,便于键盘的移动。

14

图 6 软键盘界面

3.1.3 记事本结构设计

文件列表

功能选择

建立新文件

功能选择

打开文件

读取文件内容

功能选择

打开列表中

文件读取内容

软键盘

输入文本

读取并显示下

一个文件内容

选择保存

修改后文件

删除文件

图 7 记事本结构图

如图8所示,文件列表界面是记事本的入口和出口。记事本通过调用文件列

表功能菜单对文件执行各种操作。在文件列表功能菜单中根据所选择的菜单条目

进入相应的功能界面,如新建文件编辑界面、文件显示内容界面或删除文件提示

框界面等。各个界面都有自己的功能菜单,通过调用自己的功能菜单对当前界面

进行下一步的操作,如当新建文件界面显示时,可通过菜单进行打开文件操作和

软键盘输入操作;当打开文件时在文件内容的显示界面上,可通过菜单进行显示

下一个文件内容的操作和软键盘编辑修改文件内容的操作,并在文件内容修改后,

可通过修改文件提示框选择是否保存修改后的文件内容。

15

3.1

电子相册架构设计

3.2.1 电子相册设计需求

电子相册支持jpg、png、gif、xpm、和bmp格式图片的浏览,并可以对图

片进行放大、缩小或旋转角度显示。电子相册还支持幻灯片模式浏览图片,并可

以对图片进行删除等操作。

(1) 显示图片列表功能:在图片文件所在目录读取所有扩展名为jpg、xpm、

png、bmp、gif格式的图片文件,并将读取的文件按顺序用相同大小的缩略图的形式

显示在图片列表界面上。如果图片数量超过当前屏幕显示范围时,可向下滚动显示。

其它格式文件忽略不读。

(2) 图片选中显示功能:在图片列表中选定某个图片时,此图片的缩略图成

凸起放大状态,表示选中此图片并将对此图片进行操作。

(3) 删除图片功能:对当前选中的图片可执行删除操作,选择删除后会进行

删除确认提示,若选择彻底删除图片则从物理设备上和图片列表上将该图片删除。

(4) 浏览图片功能:对选中的图片可以执行浏览的功能,若图片原本大小超

过图片浏览区域(即相框)的大小,则会自动调整变成适应图片浏览区域的最大尺

寸。若图片原本大小没有超过图片浏览区域大小,则以原始尺寸在图片浏览区域显

示。可对打开的图片进行放大、缩小、向左旋转、向右旋转、全屏模式与返回原始

尺寸等一系列的浏览模式操作。

(5) 图片放大功能:在当前图片尺寸大小的基础上,图片可逐级放大,以尺

寸的0.5倍递增,最大可放大到打开图片时显示的初始尺寸的3倍。

(6) 图片缩小功能:在当前图片尺寸大小的基础上,图片可逐级缩小。最小

可缩小到打开图片时显示的初始尺寸的0.5倍。

(7) 图片旋转功能:打开图片后,可在图片的任意状态下对图片进行旋转操

作。可在当前状态下,将图片向左或向右旋转,每次旋转角度差值为90°。图片旋

转后会自动适应窗口大小,完整显示图片。

(8) 图片移动功能:图片执行放大功能后,图片可在浏览区域进行移动。

(9) 图片全屏显示功能:可以将图片执行全屏显示。为了支持点击操作,全

屏显示时不覆盖相关功能按钮。

(10) 幻灯片模式自动浏览功能:可从当前选定的图片开始执行自动播放图片

功能,初始设定播放速度为3秒间隔,可以加速或减速播放。

(11) 给用户提供友好的图形交互界面,并合理安排界面元素布局,使其美观

并且方便用户操作。

3.2.2 电子相册界面设计

电子相册列表界面设计:

16

如图9所示,电子相册图片列表界面大小设定为320*240。界面的上方显示

当前选中的图片的名字。中间的显示区域以4*3(即4列3排)格式对图片的缩

略图进行排列,被选中的图片被突出放大显示。界面的最下方为两个按钮,左侧

的是功能按钮,右侧的是返回按钮,此界面上分别标记为“Option”和“Exit”。

图 8 图片列表界面

电子相册功能菜单设计:

如图10所示,功能菜单大小以菜单项的多少具体而定,但一定要小于图片

列表界面大小的尺寸。菜单上显示可操作的功能选项,并对选定的功能选项高亮

显示。界面的最下方为两个按钮,左侧的是功能按钮,右侧的是返回按钮,此界

面上分别标记为“Select”和“Cancel”。

图 9 功能菜单

相邻两个界面之间切换时,若后出现的界面大小小于先出现的界面大小,则

第一个界面显示蒙版即表示为禁用状态,如图10。

电子相册浏览界面设计:

电子相册浏览界面上方显示所显示图片的文件名,图片浏览区显示具体要求

下的图片状态,如正常显示的图片(图11)、放大的图片(图12)、缩小的图

片(图13)或旋转的图片(图14)等。界面的最下方为两个按钮,左侧的是功

能按钮,右侧的是返回按钮,此界面上分别标记为“Option”和“Back”。

17

图 10 正常显示图片浏览界面

图 11 放大图片浏览界面

18

图 12 缩小图片浏览界面

图 13 图片旋转角度浏览界面

3.2.3 电子相册结构设计

如图15所示,图片列表界面为电子相册的入口和出口。通过图片列表功能

菜单,可执行打开图片进行浏览的功能和删除图片的功能,并根据所选择的功能

进入图片浏览界面或显示删除文件提示框。进入图片浏览界面可通过图片浏览功

能菜单,对当前显示的图片执行各种操作,从而进入相应的图片浏览界面。放大

图片的显示,缩小图片的显示,旋转图片的显示,图片全屏的显示和自动浏览图

片的显示均将显示在图片浏览界面。而各种模式下的图片浏览界面下,均可以通

过功能菜单对其他浏览模式进行选择。

图片列表

功能选择

删除图片

图片逆

时针旋转

打开图片

功能选择

图片顺

时针旋转

正常显示图片全屏显示图片自动浏览图片放大显示图片缩小显示图片

图 14 电子相册结构图

19

4 算法设计和实现

4.1

记事本主要算法设计和实现

4.1.1 记事本类结构设计

NpMytextedit

NpMessageboxNpNotepadFormNpSaveForm

NpOpennoteFormNpFunctionviewFormNpNewnoteForm

NpOpenoptionFormNpDeleteNoteFormNpNewoptionForm

MyKeyboard

MyKey

图 15 记事本类图

类图说明:

NpNotepadForm为记事本程序的主界面类,即显示文件列表的类。

NpFunctionviewForm为功能菜单的基类,也是文件列表功能菜单的实现类。

NpNewnoteForm为新建文件的功能实现类。NpOpennoteForm为打开文件的功能实

现类。NpDeletenoteForm为删除文件的功能实现类。NpNewoptionForm为新建文

件功能菜单的实现类。NpOpenoptionForm为打开文件功能菜单的实现类。

NpSaveForm为文件名保存实现类。NpMessagebox为内容修改提示框的功能实现

类。MyKey是软键盘上的按钮的实现类,MyKeyboard为软键盘功能实现类。

MyTextedit是Qt类中QTextEdit类的子类,实现键盘响应函数功能的权限升级,

即从protected升级为public。

NpNotepadForm与NpfunctionviewForm成单项关联关系。

NpFunctionviewForm分别与NpNewnoteForm、NpOpennoteForm、

NpDeletenoteForm成单向关联。

NpNewnoteForm与NpNewoptionForm单项关联。

NpOpennoteForm与NpOpenoptionForm双向关联。

NpOpenoptionForm与NpDeletenoteForm、MyKeyboard分别为单向关联。

20

NpNewnoteForm分别与NpOpennoteForm和MyKeyboard单向关联。

NpOpenoptionForm和NpNewoptionForm继承于类NpFunctionviewForm。

MyKeyboard依赖于MyKey,若MyKey类发生改变MyKeyboard也将发生改变。

MyTextedit与NpNewnoteForm类和NpOpennoteForm为聚合(聚集)关系。

NpSaveForm与NpNewnoteForm为聚合(聚集)关系。

NpMessagebox与NpOpennoteForm是聚合(聚集)关系。

4.1.2 记事本功能实现

记事本界面用到的控件主要有QLable、QToolButton、QTextEdit和QListBox

等。

(1) 记事本文件列表的实现:首先扫描文件夹下的所有文件,包括隐藏的

所有文件名,过滤记事本文件,并将这些记事本文件名根据创建时间的先后进行

排序存储到文件链表中,将文件链表中的所有文件显示在文件列表界面。流程图

如图17。

(2) 功能菜单的实现:在记事本设计中有3个功能菜单界面,其中打开和

新建的功能菜单均继承自记事本文件列表界面的功能菜单,这三个界面都含有一

个QListBox控件,但是菜单项不同,并根据不同的菜单项实现不同的功能。流

程图如图18。

(3) 新建文件的实现:首先提示输入文件名,并检查文件名的合法性。如

果文件名不符合要求,则设置文件名的输入无效,并提示重新输入。如果不输入

文件名则提供默认的文件名,进入文本编辑界面,然后按照界面的宽度对文本输

入进行限定,到界面宽度最大值时自动换行。并且使文本保存时输入到物理设备

上时支持unicode编码。流程图如图19。

21

开始

扫描文件目录下

所有文件包括隐藏文件

对目录下文件按建立时间进行排序

检查目录下是

否有记事本文件

Yes

将所有记事本文件名存入链表

建立文件列表迭代器

按照文件名链表中文件的顺序

显示文件名列表在列表显示界面上

No

设定文件列表中默认选择项

结束

开始

显示菜单项

图 16 显示文件列表流程图

Switch(选择菜单项)

关闭父窗口蒙版

新建文件功能实现

关闭父窗口蒙版

打开文件功能实现

关闭父窗口蒙版

删除文件功能实现

关闭父窗口蒙版

软键盘功能实现

退

关闭父窗口蒙版

返回文件列表

结束

图 17 功能菜单流程图

22

开始

提示输入文件名

No

文件名是否合法

Yes

进入文本编辑界面

设定文本自动换行方式

设定文本自动换行位置

接受文本编辑

提示文件名不合法

显示

菜单

执行菜单功能

选择保存文件

还是显示功能菜单?

保存

文件

文本内容是否为空?

No

Yes

保存文件到当前目录下

结束

图 18 新建文件流程图

(4) 打开文件功能的实现:从文件列表选定打开的文件,然后将文件内容

读到QTextStream中再显示在QTextEdit中,并且规定显示格式。如果文件内容

被修改后,提示文件是否需要保存。如果通过菜单选择打开下一个文件,则查找

到当前文件的下一个文件,并将其文件内容显示于界面显示区域上。流程图如图

20。

(5) 软键盘的实现: 定义按键类MyKey继承自QPushButton,点击的时候

发射该按键的文字。在类MyKeyboard中组合使用MyKey,并将MyKey发射的信

号与接收软键盘输入的槽进行连接。根据软键盘上边缘上的点击的拖动,通过跟

踪移动点的坐标位置,使整个软键盘进行相应距离的移动。流程图如图21。

23

开始

选定待打开的文件

设定文本自动换行方式

设定文本自动换行位置

打开文件并显示文件内容

接受文本编辑

显示

菜单

选择退出文件

还是显示功能菜单?

退出

文件

文件内容是否被修改?

Yes

No

执行菜单功能是否保存修改后的文件内容?

Yes

保存文件内容

No

退出文件

结束

图 19 打开文件流程图

开始

定义软键盘按键MyKey

软键盘按键布局

载入软键盘上各按键显示字符

设置点击事件过滤器

键盘

边缘

随点击动作移动而移动

键盘在界面上的位置

向文本编辑区输入字符

Cap

设定Cap键切换状态

按键上字符

是大写还是小写?

数字

字母

点击的是按键还是键盘边缘?

按键

ESC

Switch(按键字符)软键盘界面退出

Enter

光标位置处文本换行

Shift

设定Shift键切换状态

BackSpace

删除光标左侧字符

按键上字符

是否是上字符?

Yes

按键上字符显示

为普通字符

No

按键上字符显示

为上字符

按键上字符转为

为小写字符

按键上字符转为

大写字符

结束

图 20 软键盘流程图

24

4.2

电子相册主要算法设计和实现

4.2.1 电子相册类结构设计

4.2.1

AlbPicChooseForm

AlbDelFormAlbMenuForm

AlbPicViewForm

AlbPicOptionForm

图 21 电子相册类图

类图说明:

电子相册程序定义了5个类,AlbPicChooseForm为电子相册图片列表界面

类,AlbMenuForm为电子相册图片列表功能菜单类,AlbPicViewForm为图片浏览

类,AlbOptionForm为图片浏览界面的功能菜单类,AlbDelForm为图片删除类。

AlbPicChooseForm和AlbMenuForm成单向关联关系。

AlbMenuForm和AlbDelForm、AlbPicViewForm分别成单向关联关系。

AlbPicViewForm和AlbOptionForm成双向关联关系。

其中,对图片的各种处理均在AlbPicViewForm类中实现,如放大、缩小、

逆时针旋转、顺时针旋转、全屏显示、图片移动显示等。

4.2.2 电子相册功能实现

(1) 用户进入电子相册后,首先显示图片列表。图片列表由12个Label

组成,将从当前目录下扫描jpg、xpm、png、gif、bmp格式的图片并将其名称存

入链表中,通过load函数加载图片到一个QImage类型的变量中,然后将此变量

与Label关联起来,以实现图片在Label上的显示。值得注意的一点是,此Label

上加载的图片均为真实图片的缩略图,而不是图片本身。如果图片的缩略图已经

存在,则将缩略图直接显示在Label上,如果缩略图不存在,则生成图片的缩略

图。如果该图片文件为非法图片格式文件,则在该Label上载入一个标志着读取

图片文件失败的图片。缩略图是图片的真实缩影,在缩小时保持原图片的比例。

流程图如图23。

(2) 图片选中状态功能实现:首先设定图片选中状态的表示方式,即缩略

图图片的尺寸放大,满足缩略图宽为80像素或高为60像素中任一条件,保持图

片的宽高比例与原图片宽高比例相同,选中状态下的图片缩略图在图片列表界面

上凸起显示。如果图片是标志为格式不正确的图片,则该图片被选中或离开选中

25

状态时不做放大缩小动作以示与正常图片的区别。且根据不同的按键按下,进行

不同位置图片的选中。主要实现流程图如图24所示。

开始

设定图片列表显示界面格式(4*3)

扫描文件目录下

所有文件包括隐藏文件

是否有

j

pg、xpm、png、gif、bmp

No

格式图片

Yes

将所有图片文件名存入链表

建立文件列表迭代器it

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

No

图片文件是否是

it中最后一个文件

Yes

显示加载图

片的第i个Label

设置第i个Label隐藏

是否存在迭代器

中图片的缩略图

No

根据文件头判定

是否是正确的图片格式

No

根据原始图片

比例设定缩略图大小

生成图片缩略图

设定此图片缩略图为名

为“错误标志图片”的图片

加载图片缩

略图到第i个Label

Yes

Yes

循环结束

结束

图 22 图片列表显示流程图

26

开始

设定选中图片的状

态及默认选中图片

switch(按键)

下方

向键

当前图片是否

是界面上最后一排?

Yes

图片链表中当前

No

图片位置+4上,是否有

图片存在?

Yes

图片列表图片整

体向上滚动一排,呈

选中状态的图片改变

No

呈选中状态

的图片为下一

排的同一列图片

左方

向键

图片链表中当前

图片位置-1上,是否有

图片存在?

右方

向键

图片链表中当前

图片位置+1上,是否有

图片存在?

No

呈选中状态

的图片为上一

排的同一列图片

下方

向键

当前图片是否

是界面上最上一排?

Yes

图片链表中当前

图片位置-4上,是否有

图片存在?

Yes

图片列表图片整体

向下滚动一排,呈选

中状态的图片改变

当前图片的前一

张图片呈选中状态

当前图片的后一

张图片呈选中状态

结束

图 23 选择图片流程图

(3) 删除图片功能实现:在图片列表界面上对选中图片要进行删除操作时,

需注意两点,一点就是待删除的图片是否是图片列表的最后一张图片,若是的话,

则删除图片后,被删除图片的前一张图片呈选中状态。否则,删除图片后,被删

除图片的后一张显示为选中状态,且此图片删除后,图片文件链表中删除图片节

点,其列表界面中图片的位置要统一向前移动一个位置。流程图如图25。

开始

选择待删除图片

图片是否是图片

链表中的最后一张图片

Yes

删除目录下图片,

并删除链表中图片名

设定选中当前图片链表

中的最后一张图片

No

删除目录下图片,

并删除链表中图片名

设定选中当前图片链表

中的后一张图片

调整图片列表界面图片显示

结束

图 24 删除图片功能实现流程图

27

(4) 图片的放大功能的实现:设定md_ChangeSize来记录放大的倍数,并

且当放大到最大倍数时,将菜单项上的“放大”改成相应的提示菜单条“已经达

到最大,并且根据放大倍数在浏览区域的相框上绘制图片。功能实现流程图如图

26.

开始

Yes

md_ChangeSize等于3

No

md_ChangeSize等于0.5

No

Yes

改变菜单条目状态

调用Scale()函数得出新的pixmap

调用repaint()函数画出新的pixmap

结束

图 25 图片的放大功能实现流程图

(5) 图片缩小功能的实现:可在图片的任意大小状态下进行缩小,直到图

片缩小到初始打开图片显示尺寸的0.5倍大小。缩小图片时要保证缩小后的图片

依然居于相框

开始

md_ChangeSize等于0.5

No

改变md_ChangeSize的值

md_ChangeSize等于0.5

Yes

改变菜单条目状态

边界调整,修正mi_MoveX与

mi_MoveY的值

调用Scale()函数得出新的pixmap

调用repaint()函数画出新的pixmap

结束

Yes

No

图 26 图片缩小功能实现

28

中间位置。在图片非全屏模式和全屏模式两种情况下,判定当前状态的图片与初

始时显示的位置移动的距离大小,并根据不同的图片旋转角度,据此距离大小计

算并设定相应的图片在相框中的位置坐标。实现流程图如图27。

(6) 图片移动功能实现:图片在放大到1.0倍以上时,可进行图片在相框

内的上下或左右移动显示。图片在全屏模式下选择放大时图片也可以进行上下或

左右移动显示。为保证在移动时正确显示在相框内的图片视区,需要将图片在每

次移动时进行重画,并计算图片位置的移动距离。实现流程图如图28。

开始

md_ChangeSize小于等于1.0

No

取得当前鼠标坐标位置并根据旧的

鼠标坐标位置mi_OldX、mi_OldY

计算得出坐标移动参数mi_NewX、

mi_NewY

根据mi_NewX、mi_NewY更新

mi_MoveX、mi_MoveY

边界调整,修正mi_MoveX与

mi_MoveY的值

记录下当前的鼠标坐标mi_OldX、

mi_OldY

调用repaint()函数画出新的pixmap

结束

Yes

图 27 图片移动功能实现流程图

(7) 相框内图片显示功能的实现:不同的选择下,相框内的图片显示状态

是不同的。对于图片的显示需要考虑的情况有是否是全屏模式,当前的缩放倍数

和当前的旋转角度,并需要根据判断图片是否移动来对显示边界进行检测及计算。

根据图片缩放和旋转参数和检测到的移动距离,利用矩阵计算出新图片所需的各

个参数,根据这些参数生成显示在相框内的图片。最后将图片绘制在相框内,即

当前的图片浏览区内。图29即为图片显示功能实现的流程图。

29

开始

读取用户操作,改变对应参数

比较图片大小与相框大小

No

是否图片比相框小

Yes

以图片原始大小显示,图片的像素

宽高参数mi_WidthSize和

mi_HeightSize为原始图片宽高值

调整显示图片的像素宽高参数

mi_WidthSize和mi_HeightSize

使之可以按原始比例大小在相框中

最大化显示

读取图片缩放参数mi_ChangeSize,把

它与mi_WidthSize、mi_HeightSize

相乘,把结果分别与原始图片的宽高

相除,得出缩放倍数

读取旋转角度参数mi_Angle

将原始图片按计算出的缩放比例缩

放,并按mi_Angle中的角度旋转

将得到的图片保存在

mQP_PixmapScaled中

调用repaint()函数将

mQP_PixmapScaled在相框中显示

结束

图 28 图片显示功能实现流程图

30

5 结 论

本文围绕用户的基本需求,提出了一个基于嵌入式Linux操作系统和图形用

户界面QT的嵌入式终端 电子相册设计方案。该设计方案具有低耦合、高内聚、

可扩展、可移植等良好特点,并在设计的基础上将该方案实现。电子相册和记事

本均可支持中、英、日文三种语言界面。 电子相册的界面切换中均使用到了蒙

版效果,达到视觉上的美化效果,是设计上的一个特色。记事本对文件新建、打

开、删除、提示保存等功能已经基本完善。电子相册的各种模式(如放大、缩小、

顺时针旋转、逆时针旋转、全屏显示、自动播放)下的图片浏览及图片的删除等

功能也在电子相册软件中得到充分的体现。并且 电子相册设计中均采用了模块

化的设计思想,便于以后的功能扩展。 电子相册软件经过反复修改验证,通过

了单体测试和结合测试,均能正常且高效的工作,达到了预期的目标。

由于时间关系,本文仅实现了 电子相册的基本功能。在 电子相册的设计中,

还存在着许多的不足之处。还需要更多拓展功能的支持,才能使开发出的软件经

受住市场的考验,使其在众多嵌入式终端应用软件开发中具有竞争力。我们需要

做的事情还有很多,例如记事本的界面的整体美化,软键盘的中文输入法,记事

本提醒功能等;电子相册的界面的列表模式切换,如缩略图列表、文件名列表等

的切换,和电子相册浏览图片时的切换效果等。 总体来说,本文所设计的 电子

相册可以应用到多种场合:公用多媒体终端、手机、PDA等小型或手持型嵌入式

设备。正是由于这些应用需求,促成了本次开发的设计和实现。

31

参考文献

[1] 陈英,梁建武.Linux基础及应用教程.水利水电出版社,2008,29-42

[2] 丁丁,习勇,魏急波.三种主流嵌入式图形用户界面的移植及性能比较.电子

产品世界,2004.(9):73一74

[3]丁林松,黄丽琴.Qt4图形设计与嵌入式开发.人民邮电出版社,2009,45

-69

[4] 金西,黄汪.嵌入式Linux技术及其应用.计算机应用,2000,20(7):5-6

[5] 刘峥嵘.嵌入式Linux应用开发详解.机械工业出版社,2004,53-68

[6] 林锐,韩永泉.高质量程序设计指南:C++、C语言.电子工业出版社,2007,

124-155

[7] 倪继利.Qt以及linux操作系统窗口设计.电子工业出版社,2006,45-152

[8] 钱能.C++程序设计教程.清华大学出版社,2006,56-88

32

致 谢

本文在撰写过程中,得到了江西应用工程职业技术学院徐行老师和徐春华老

师的悉心指导和帮助,他们对本论文的写作提出了非常宝贵的意见,在此表示衷

心的感谢。另外,在资料收集阶段,邓君先生为我提供了许多关于中国出版业现

状的重要资料;同时,本文还参考了大量专家学者的著作,得到了同窗好友的帮

助,在此一并表示真诚的感谢!

33

签名:

年 月

本文标签: 图片文件功能显示界面