画图板的设计与实现毕业论文设计_第1页
画图板的设计与实现毕业论文设计_第2页
画图板的设计与实现毕业论文设计_第3页
画图板的设计与实现毕业论文设计_第4页
画图板的设计与实现毕业论文设计_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京邮电大学毕业设计(论文)任务书第1页毕业设计(论文)题目:画图板的设计与实现毕业设计(论文)要求及原始数据(资料):1.深入了解linux下的qtcreator的相关技术;2.熟悉使用qt布局管理器的相关技术;3.熟练掌握qtUI编辑界面的应用,训练编写程序的能力;4.深入分析qt中的信号和槽函数的机制;5.设计并实现qt下的画图板的基本功能;6.训练检索文献资料和利用文献资料的能力;7.训练撰写技术文档与学位论文的能力。第2页毕业设计(论文)主要内容:Qt的介绍与具体应用;QT中的信号和槽函数的机制;画图板功能设计;画图板界面设计;画图板涂鸦功能实现;画图板绘制基本图形的实现;实现编辑菜单功能;学生应交出的设计文件(论文):1.内容完整、层次清晰、叙述流畅、排版规范的毕业设计论文;2.包括毕业设计论文、源程序等内容在内的毕业设计电子文档及其它相关材料。第3页主要参考文献(资料):[1]陈英,梁建武.Linux基础及应用教程.水利水电出版社,2008,29-42[2]倪继利.Qt以及linux操作系统窗口设计.电子工业出版社,2006,45-152[3]BlakowskiG,SteinmetzR.Amediasynchronizationsurvey:referencemodel,specification,andcasestudies[J].IEEEJournalSelectedAreasinCommunications,1996,14(1):5-35[4]Linux技术及其应用.计算机应用,2000,20(7):5-6[5]Linux应用开发详解.机械工业出版社,2004,53-68[6]林锐,韩永泉.高质量程序设计指南:C++、C语言.电子工业出版社,2007,124-155[7]JonathanCorbet,AlessandroRubini,GregKoah-Hartman.LinuxDeviceDriver.Jan2005[8]钱能.C++程序设计教程.清华大学出版社,2006,56-88[9]QtEmbedded的嵌入式Linux应用程序的实现,计算机应用与软件,2006,2[10]ISO/IECJTC1/SC29/WG11.IS14496:Genericcodingofmovingpicturesandassociatedaudioinformation(MPEG-4).ISO/IEC,2000:10-15[11]谭浩强.C++面向对象程序设计.清华大学出版社,2006,89-100[12]王子强,刘海燕,李媛州.Linux下图形用户界面程序的开发与实现,计算机应用与软件,2005专业班级软件1025班学生南茜要求设计(论文)工作起止日期2014年3月17日~2014年6月27日指导教师签字日期2014年3月17日教研室主任审查签字日期系主任批准签字日期画图板的设计与实现摘要本文的主要内容是记述同题课程设计中的一些关键技术和辅助文档。本文的目标是设计一款基于Qt编程语言的简易画图板,使其具有涂鸦,绘制基本图形等功能。本程序具有一定的实用意义和价值。功能分装良好可以方便的根据需求进行扩充。本文运用材料综述的方法,首先记述了编程环境的搭建,介绍了Qt的优点,Qt编码规范和Qt的双缓冲机制在绘图中的运用。着重分析了Qt在软件开发中的编程机制,并根据应用特点进行了设计的构件与算法的需求分析。其次在需求分析中给出是可行性分析,然后放入功能分析图和流程图帮助梳理设计思路。最后在详细设计阶段完成编码,实现程序功能,得到一个功能健全的画图板应用程序。在本文中将设计并实现画图板的一些基本功能,例如:新建,打开,保存,清空,放大,缩小,还原,基本图形绘制,转换画笔颜色等功能。最后运行结果符合设计要求,方案可行。经过测试后程序功能实现良好。关键词嵌入式LinuxQT;图形用户界面;电子画板;双缓冲机制TheRealizationofDrawingBoardFunctionAbstractThemaincontentofthispaperisdescribedwiththecourseinthedesignofsomekeytechnologiesandsupportingdocuments.ThegoalofthisarticleistodesignasimpledrawingboardbasedonQtprogramminglanguage,makeitshavegraffiti,drawupthebasicgraph,andotherfunctions.Thisprogramhasacertainpracticalsignificanceandvalue.Functionaccordingtotherequirementsofgoodpackagingcaneasilyexpanded.

Thisarticleappliesthemethodofmaterialreview,theconstructionofthefirstdescribestheprogrammingenvironment,thispaperintroducestheadvantagesofQtQtcodeconventionsandQtdouble-bufferingmechanismusedinthedrawing.Qtprogramminginthesoftwaredevelopmentmechanismisanalyzedemphatically,andthedesignbasedontheapplicationofartifactsandrequirementsanalysisofthealgorithm.Secondisfeasibilityanalysisisgivenintherequirementsanalysis,andthenintothecombfunctionanalysisdiagramandflowcharttohelpdesignthinking.Programisrealizedbyencodingthedetaileddesignphaseiscomplete,thefunction,getafunctioningdrawingboardapplication.

Designedandimplementedinthispapersomebasicfunctionofdrawingboard,forexample:thenew,open,save,empty,enlarge,shrink,reduction,basicgraphicsrendering,convertthebrushcolor,andotherfunctions.Finallyrunresultsconformtotherequirementsofthedesign,theschemeisfeasible.Programfunctionisgood.KeywordsLinuxQT;graphicaluserinterface(GUI);electronicdrawingboard;doublebufferingmechanism目录TOC\o"1-3"\t"Abstract,1,标题小三居中,1"\h17488摘要 i20792Abstract ii267921引言 1294541.1研究背景 1451.2研究的目的和意义 2144761.3程序设计的环境选择 25562画图板设计的技术背景 3223422.1Qt的主要特征 3254652.2QTcreator简介 3307272.3Qtcreator环境搭建 4153212.4QT编程机制信号与槽机制简介 595022.5Qt编码规范 7244642.6GDI绘图理论基础 9205192.7双缓冲机制 9221562.8双缓冲技术绘图 10212683画图板项目需求分析 1296703.1可行性研究 12119053.1.1经济可行性 12176153.1.2技术可行性 1260363.1.3运行可行性 12104083.1.4时间可行性 12148423.1.5法律可行性 12220863.2功能分析 13304083.3系统用例分 13170283.4性能需求 13284743.4.1应用需求分析 14128743.4.2运行需求分析 14252653.4.3其他需求分析 1495154画图板概要设计 15249264.1画图板功能模块关系与划分 15260674.2画图板总体设计流程图 16304535画图板详细设计 17294215.1画图板界面设计 1822035.1.1画图板的界面元素声明 18281575.1.2图板界面布局实现 19166465.2画图板功能详细设计 2069265.2.1画图板的文件编辑功能实现 20157445.2.2画图板的图片编辑功能实现 2317215.3画图板绘图功能实现 2648165.3.1绘图板的基本图形绘制功能实现 2628085.3.2绘图板自由绘图功能实现 3046505.3.3画图板画图辅助选项实现 33324736画图板程序测试 35183456.1测试的重要性及目的 354956.2测试的方法 36258996.3测试用例 36216946.4测试结果 363035结论 388179参考文献 395776致谢 4015481外文原文 411588中文翻译 49引言随着操作系统不断的更新换代,其自带的画图板界面及功能也是不断变化着,像是xp、vista、win7,它们的画图板的界面布局风格以及功能都有所不同。

这表明尽管是简简单单的一个操作系统自带画图板,系统设计人员也没有停止对它的不断研与探索,他们在不断寻找着更人性化、更能满足大众需求的改变。

随着社会的不管发展以及计算机的不断普及,人们对画画的要求越高,对绘图系统也提出了更高更全面的要求。许多用户由于自身的画图习惯或者是视觉效果不同,对传统的画图工具可能感觉不是特别满意。就像孩子总是喜欢画可爱型,而成人则画实用的。不同年龄不同身份的人,需求不同。综合上述,为了尽量让所有人满意,在此我设计一个大概的程序模型,让别人来试试我的绘图系统。对自从上世纪计算机系统向绘画界的延伸以来,绘图技术已成为计算机系统不可分割的一部分。而图形编辑器又是图形编辑软件的基础,几乎所有的图形编辑软件,都是在拥有基本图形编辑功能的基础上实现更复杂功能的。故在图形应用非常广泛的今天,研究开发绘图系统是非常有意义的。在绘图方面实现绘制直线、矩形、圆形等基本功能,在界面设计方面实现了对图形的操作,从而从底层对绘图系统进行简单的实现。

与此同时,简单小巧的绘图记事功能软件的发展也在蓬勃向前。本软件功能与Windows下附件中的画图软件有类似功能。绘制方面的实现功能包括图片的打开新建保存,画布的放大缩小,画笔功能实现,基本图形的绘制,绘图时可以选择各种颜色,各种线宽。软件支持保存和读取jpg格式的图形。本软件运用的是面向对象程序设计的思想。相对于面向过程的设计理念,面向对象的设计方法更适用于画图板的设计,它使画图板所涉及的各部分功能模块实现更好的封装。它的特色是。一方法的唯一性,即方法是对软件开发过程全过程进行综合考虑得到的。二是高度的独立性,对象是程序的基本元素,它将数据和操作紧密地连结在一起,并保护数据不会被外界的函数意外地改变。三是良好的可扩展性,相对独立的功能模块使得程序可以根据需要进行相印的扩充或是缩减。

研究背景计算机绘图是相对于手工绘图而言的一种高效率、高质量的绘图技术。手工绘图使用三角板、丁字尺、圆规等简单工具,是一项细致、复杂和冗长的劳动。不但效率低、质量差,而且周期长,不易于修改。计算机绘图的发展更加趋向于用户需求导向,在一些专业领域中计算机绘图发展迅猛,例如Photoshop、Adobeimage、AutoCAD等。多个程序的汇集,组成功能齐全、能够绘制基本地图图形和各类常用地图的程序组,称为绘图软件系统,或称为绘图软件包。绘图软件通常用高级算法语言编写,以子程序的方式表示,每个子程序具有某种独立的绘图功能。绘图软件包是绘图子程序的汇集,可包括几十个至几百个子程序。用户根据需要,调用其中一部分子程序,绘制某种图形或一幅地图。研究的目的和意义日常生活中,有很多方面都会用到画图来解决阐述一些问题,这就需要借助计算机来进行简单的画图工作,此时就需要一个能简单解决这些问题的画图软件。本选题是设计一个简单的基于Qtcreator的画图软件,能够完成一些简单的画图需求。现在比较经常使用的是windows系统下附带的画图软件,它基本上可以满足一些简单的画图需求。本设计就是按照这个画图软件的思想设计的,使画图软件能达到满足日常画图需求,便于存储编辑和展示,且要求功耗小且界面人性化,功能易扩展。程序设计的环境选择Qt类库大致可以分为三个部分:控件,框架和工具。控件部分包括环境控件、主窗口控件、标准对话框、基本的GUI控件、扩展GUI控件、GUI组织控件以及帮助系统控件。框架部分包括的是一些抽象的类,通常不可见,如对象模型、抽象控件、绘图、拖放、控件外观。工具部分包括时间日期和链表树等数据结构,它们和GUI无关普通工具包括链表、堆栈、队列、树等常见数据结构,如QArray。图形处理工具控制图像的编码/解码算法。如QIm—agelO。I/O控制工具处理I,0的一些类,如QFile。时间和日期工具类处理时间和日期,如QDate,QTime。在用Qt开发程序时,对于GUI的设计有两种方法,一种是通过自己写代码来界面进行布局,但这就需要对Ol有一定的熟练程度;另一种是通过QtDesigner来设计界面,只需在ui文件来拖控件来布局就行了。对只需要用Qt进行开发的程序员来说,后者显然比前者来的快。以下结合一个实例来介绍用QtDesigner来开发程序的GUI,主窗口类从QWidget类派生,这样我们能方便地使用Qt的QMenubar类来添加菜单,并使用Qt的控件类来摆放面板控件,整个程序以事件为驱动,通过Qt的signal—slot机制与终端用户交互。设计好界面后,在程序编译后会生成一个ui一.h的头文件.里面是一个Ui一类,封装了一些所拖放控件的变量名和一个比较重要的setupUI函数,是一些布局的代码。要用到这个界面是只需继承这个类就可以了,或者是包含这个ui~.h的头文件。设计类的主要思想是把所有的信号和槽放在构造函数里,程序是以事件为驱动,当产生一个信号时,会去调用相应的函数。

画图板设计的技术背景Qt的主要特征Qt是Trolltech公司的产品,Trolltech是挪威的一家软件公司,主要开发两种产品:一种是跨平台应用程序界面框架;另外一种就是提供给做嵌入式Linux开发的应用程序平台,能够应用到PDA和各种移动设备,Trolltech公司

://trolltech/。

Qt是一个多平台的C++图形用户界面应用程序框架,它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象,很容易进行扩展,并且允许真正的组件编程。1996年开始,Qt正式进入商业领域,它成为了全世界范围内数千种成功的应用程序的基础。Qt同时也是流行的Linux桌面环境KDE

的基础,注:KDE是所有主要的Linux发行版的一个标准组件。它具有以下优点:1)优良的跨平台特性Qt支持下列操作系统:MicrosoftWindows95/98,MicrosoftWindowsNT,Linux,Solaris,SunOS,HP-UX,DigitalUNIX(OSF/1,Tru64),Irix,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX等等。2)面向对象Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为信号与槽(signals/slots)的安全类型来替代callback,通过一个对象信号的发射,另一个槽函数的响应,使各个对象之间的通信安全而且高效,这使得各个元件之间的协同工作变得十分简单。并且QT是直接基于Xlib的,不依赖Motif工具包,所以它的执行效率比一般的基于平台的代码的执行效率要高。3)丰富的APIQt包括多达250个以上的C++类,还提供基于模板的collections、serialization、file、I/Odevice、directorymanagement、date/time类。甚至还包括正则表达式的处理功能。4)支持2D/3D图形渲染,支持OpenGL5)大量的开发文档6)XML支持QTcreator简介QtCreator是跨平台的Qt集成开发环境,QtCreator是Qt被Nokia收购后推出的一款新的轻量级集成开发环境(IDE)。此IDE具有良好的跨平台运行能力,支持的操作系统包括Linux(32位及64位)、MacOSX以及Windows。QtCreator的设计目标是使开发人员能够利用Qt这个应用程序框架更加快速及轻易的完成开发任务QtCreator可以帮助Qt用户更加快速便利的运行项目,还可以提高有经验的Qt开发人员的工作效率,提高代码的可读性。其中使用强大的C++代码编辑器可实现快速编写代码。语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能。使用浏览工具管理源代码。集成了领先的版本控制软件,包括Git、Perforce和Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换。为Qt跨平台开发人员的需求而量身定制。集成了特定于Qt的功能,如信号与槽(Signals&Slots)图示调试器,对Qt类结构可一目了然集成了QtDesigner可视化布局和格式构建器只需单击一下就可生成和运行Qt项目。Qtcreator环境搭建下载Qt源码包到本机,然后解压缩:

下载qt-x11-free-3.2.1.tar.gz和qt-x11-opensource-src.tar.gz二进制包。

2.在终端切换至qt-x11-free-3.2.1.tar.gz所在目录下,执行:tar

zxvf

-C

/usr/local

到/usr/local目录

PS:(推荐解压缩至/usr/local目录,目录可以根据名称自己创建)

进入用户主目录编辑该目录下的.bash_profile文件,并设置Qt环境变量,在这里我们以root用户以例。

#vi

/root/.bash_profile

//打开root用户.bash_profile文件

在root用户.bash_profile文件中设置环境变量,在此文件里面添加如下内容:

QTDIR=/usr/local/qt-x11-free-3.2.1

PATH=$QTDIR/bin:$PATH

MANPATH=$QTDIR/doc/man:$MANPATH

LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export

QTDIR

PATH

MANPATHLD_LIBRARY_PATH

添加完上面信息后按ESC键,“Shife+:”组合键回到vi编辑器命令行状态,输入wq!(强制保存退出)

添加完环境变量后,使环境变量立即生效:#source

/root/.bash_profile

四、进入Qt解压缩的目录

#cd

$QTDIR或#cd

QTDIR

使用configure工具来构建Qt库和它提供的工具:./configure(./configure

--help

配置选择的列表。例:-thread选项来创建这个库的一个多纯种版本。)

最后一步就要进入漫长的Qt安装编译时间了,有事的就出去办事吧,安装编译时间大约需要两个小时。

编译命令:make

安装命令:make

install

。首先我们进入Linux的图形界面,打开一个控制终端(在桌面空间处单击鼠标右键,在弹出的单菜中选择“新建控制终端”。),在控制终端里面新建一个.cpp文件,并编写程序,如下:

#vi

#include<qapplication.h>

#include<qlabel.h>

int

main(int

argc,char

*argv[])

{

QApplication

app(argc,argv);

QLabel

*label=new

QLabel("Hello

World!!!",0);

app.setMainWidget(label);

label->show();

return

app.exec();

}

写完上面的代码后保存退出(wq)vi编辑器。

#qmake

-project

#qmake

#make

//编译,生成HelloWorld执行文件

图2-1Qtcreator程序构件截图QT编程机制信号与槽机制简介信号/槽机制是QT区别于其它工具包的最有显著特征的部分。在GUI编程中,当一个widget改变,我们经常希望另外的widget被告知。更普遍地,我们希望任何的对象都可以互相通信。比如,如果用户点击close按钮,我们大多希望调用窗口的close()方法。以前的工具集通过callback来实现这种通信。callback是指向函数的指针,因此,若果你想让处理函数通知你某些事件,你可以传递给另一个函数一个指针来处理函数。处理函数在适当的时候调用callback。Callbacks有两种根本的缺陷:第一,它们不是类型安全的,我们无法确定处理程序会调用正确参数的回调函数(callback)。第二,回调函数耦合于处理函数,因为处理函数必须知道去调用哪个回调函数。Qt提供了回调的替代技术:信号和槽。当特定事件发生时引发相应的信号。Qt的widget有许多预定义的信号,同时我们也可以为widget子类添加我们自定义的信号。槽是回应特定的信号时所调用的方法。Qt的窗口部件有许多预定义的槽,但是我们也可以为窗口部件的子类田间我们自定义的槽,以处理我们所感兴趣的信号。信号槽机制是类型安全的:信号的签名必须跟接受的槽的签名相匹配(事实上,槽的签名可以比信号的签名短,因为它可以忽略额外的字段)。因为签名是相容的,编译器就可以帮我们检测类型的不匹配。信号和槽是松耦合的:一个类产生一个信号,并不知道而且不关心那个槽接受该信号。Qt的信号槽机制保证,如果你连接了一对信号槽,槽会在适当的时间带着信号的参数被调用。信号和槽可以附带任何类型任何数量的参数。信号和槽是完全类型安全的。槽可以用来接受信号,不过槽也是普通的成员函数。类似于对象不知道谁接受它的信号,槽也不知道是否有信号连接自己。这保证了Qt可以创建完全独立的组件。一个信号可以连接无数的槽,并且一个槽可以连接你想要连接的信号。甚至可以直接连接两个信号(当第一个信号产生,立即产生第二个信号)。信号和槽一起形成了一种强大的组件编程机制。QT的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的:不会再有回调核心转储(coredump)。可以把许多信号和你所希望的单一槽相连,并且一个信号也可以和所期望的许多槽相连。把一个信号和另一个信号直接相连也是可以的。总体来看,信号和槽构成了一个强有力的组件编程机制。如果一个类要使用信号与槽机制,它就必须是从QObject或QObject的子类继承,而且类的定义必须加上Q_OBJECT宏。signals、slots和emit是QT特有的关键字,分别用来表示信号、槽、和发送信号,移除这些关键字和预处理程序,就可以使用“标准的C++编译器”[6][7][8]。槽同其他函数一样也具有访问权限,只是槽的访问权限决定了谁可以和它相连,如一个publicslots:包含了任何信号都可以相连的槽。一个protectedslots:包含了只有这个类和它的子类的信号才能连接的槽。这就是说这些槽只是类的实现的一部分,而不是它和外界的接口。一个privateslots:包含了只有这个类本身的信号可以连接的槽,甚至它的子类都没有获得连接的权利。图2-2信号与槽机制示意图

Qt编码规范第一条:尽量不要直接引用QT示例(或其它符合GPL协议的程序源代码)中源代码如果引用了Qt示例程序,请试图在内部使用不同的代码行来组织它。如果直接使用了Qt的源代码文件,请保留位于文件首部的版权声明。如果您使用了别人编写的源代码,则需要取得相关的使用许可文书。但是如果你从建议中获得的仅仅是一些想法,而不是你实际上使用的代码,你也不需要文书。尽量不要对Qt的源代码进行修改,如果为了某重要需求而一定要对Qt源代码进行修改,那么一定要在源代码中修改的位置做详细的说明,并署名。另外还要书写详细的修改文档。第二条:工程文件命名遵循的原则工程文件(.pro)命名采用:工程名+.pro的方式.ptro文件中HEARDERS和SOURCE行中如果有多个文件名(一般都会有的),则使用“\”将他们隔开,并且使每一个文件名单独占一行。原则上文件名的先后顺序没有限制,但是一般的惯例是将依赖性最小的文件写在最前面,工程的主程序(一般是main.cpp)往往出现在source的最后。一般将TARGET行写在HEARDERS和SOURCE的下面。下面是范例:SOURCE=HELLO.CPPmain.cppTARGET=hello工程中所有文件和目录命名中的字母一律使用小写,以保持在windows环境下的兼容性。第三条:函数注释三部分,功能、参数和返回值每个程序都应该以一段简短地、说明其功能的注释开头。请为每个函数书写注释以说明函数做了些什么。如果有参数和返回值,也需要对其进行解释。第四条:变量、定义等注释对于每个静态变量和全局变量,请添加相应的注释语句。对于重要的变量、定义等进行注释。第五条:变量和函数的命名原则变量名或函数名中使用大写字符来区分各个部分,以便于记忆和阅读。全局(包括类中的)变量用长名字,局部变量用短名字。类成员变量前应加上m_,全局变量加上g_,仅与本模块有关的变量加上l_。如果定义Qt类库中某种类型的变量,采用将类名中大写字母提取出并合并成小写的缩写字符串的方法(去掉第一个Q),如:QLineEdit*m_leInputNum;QString*m_sName;如果程序中出现了两个类名缩写一样的问题,如:QToolBar和QToolButton的缩写都是tb,这时应将其中一个类的缩写进行变动,变动的准则以能够避免冲突,同时缩写能够表达类名为准。如这里可以将QToolBar的缩写为tbar,QToolButton仍用tb,这样就可以避免命名冲突。声明自定义对象类型的变量采用同样的方法。局部变量应尽量易懂简洁,使用常见的变量,如Num,nCount,i,j,k,n,len,pos,offset,nReadNum,index,nRet,ret,string,filename临时变量,如ltmp,ftmp,tmpStr,tempStr自定义信号以sig_开头,自定义槽以slt_开头。Sig_和slt_后面第一个单词(或其缩写)要以小写字母开头,第二个以后的单词(或缩写)要以大写字母开头。如:sig_mouseClicked(),slt_getMouseEvent()。另外,信号和槽的参数必须完全对应。在用connect进行连接的时候,信号和槽中的参数可以只写参数类型。基本结构是数个以大写字母开头的单词。返回自定义private变量值的函数命名建议以get开头,如getLength()可以表示取回成员变量m_nlength()等;设置自定义private变量的函数命名建议以set开头,如SetLength()可以表示设置成员变量m_nlength()等。这样做是为了避免与Qt类中的函数名发生冲突。全局函数命名请以小写g开头。第六条:自定义类的命名原则自定义类一般有两个文件,一个头文件,一个实现体cpp。文件名采用被封装的类名,但是一律小写。如果一些结构或宏仅与本类有关,可在类头文件中定义。任何自定义类命名不要以Q开头,以免与Qt类库中的类混淆。(对自定义的类命名建议以大写字母A开头(MMCP),表达一定版权信息,并且在文件列表时自定义类会依次排在列表的前部)。如果需要自定义一个基类,请确保该基类的类名以base结束。工程的界面类一般从Qwigdet\QMainWindow\QDialog类继承,工程主界面类的命名采用“工程名+MainWindow”方式,如:AChartMainWindow即表示Chart工程的主界面类。主界面类往往在程序的开头(main函数)处构造,建议将构造主界面类的语句(main函数)放在main.cpp中。对于一般的窗体,请在类名的最后体现窗体的类型,一般的方法是如果从Qwidget继承而来,则以Widget结尾,如果从QMainWindow继承而来则以Window结尾,从QDialog继承而来,则以Dialog结尾。如果在自定义类中(从Qt某个类继承),如果覆盖了父类中某个函数,请在该函数的声明旁边注明。第七条:类声明体中的编排在类的声明体中,请按照:Q_OBJECT、public:signals:、slots:、protected:private:,的顺序将成员变量和函数进行排列。如果需要在这个类(class)中声明某种数据类型(结构、枚举等),请将这个声明放在所有成员变量和成员函数的前面。如果在一种类型的声明中,即有成员变量,又有函数声明,请使用两个相同的类型声明将它们隔开,如:Private:Voidfunction();……Private:Intm_number;……对一般的界面类,如果使用了信号/槽,则class声明的第一行必须是Q_Object建议避免使用protected类型的成员函数或者成员变量,因为在Qt中,大量的事件处理函数(槽)均是以protected类型出现的。第九条:工程中目录的使用工程中的图片(建议以JPEG.PNG格式(避免使用gif)),统一保存在“./pics”目录中。工程使用的汉化相关文件(.po和.qm)放在“./i18/”目录中。工程的临时交换目录请以宏的形式定义(建议使用“./temp/”),不要使用固定目录。另外,请不要使用“./temp/”目录名(这个目录名在Qtforwindows的版本中有特殊意义)。第九条:界面布局原则制作Qt界面的时候,请尽量使用布局管理器(QLayout)进行布局管理,避免使用绝对坐标,除非你能够绝对肯定这个界面的尺寸是完全不会变换的。如果某个区域出现了很多控件,在保证不会影响程序控制结构的前提下,请将这些控件放在一个可以包含其它窗口控件的盒子(如QWidget,QFrame,QGroupBox)中,然后再让这个盒子出现在界面上(即这些控件以整体形式出现)。书写界面上的英文长度的时候,请与对应的中文进行比较,确保汉化后中文能够被完全显示。代码中如果出现了需要在界面上出现的文字,必须用英文表示,并且使用tr函数将其包含。如:tr(“message!”)不能在程序中将这些文字直接用中文替换。GDI绘图理论基础任何图形程序的输出,都离不开图形设备接口GDI(Graphic

Device

Interface),它是管理Windows应用程序在窗口内的绘图操作和与此相关的许多其它信息。如图形设备(打印机、显示器)的信息、绘图的坐标系统和映射模式、绘图工具的当前状态(什么样的画笔、画刷、文本的前景色与背景色、文本所使用的字体)[7]。

Windows的GDI绘制的各种图形(点、线、圆、多边形、矩形等)是与设备无关的,即在屏幕的窗口内绘图与在打印机上绘图是相似的。

GDI是一个可执行程序,它接收Windows应用程序的绘图请求(表现为GDI调用),并将它们传送给相应的设备驱动程序,再由设备驱动程序驱动相应的硬件设备,如打印机或显示器输出。

应用程序使用GDI可以对三种类型的图形进行操作:文本操作、矢量图形操作和光栅图形操作(图像操作)。

(1)文本操作是以逻辑坐标为单位来计算文本的输出位置,用户可以通过各种GDI函数来作出具有各种效果的文本。

(2)矢量图形指的是利用画点、直线、曲线(折线、贝塞尔曲线等)、多边形、扇形、矩形等函数所绘制的图形。

(3)光栅图形操作是指以光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出,其在屏幕上表现为对若干个行和列的像素操作。光栅图形操作是直接从内存到显存的拷贝操作,其缺点是需要额外的内存空间,优点是操作速度快。双缓冲机制所谓“双缓冲区”,故名思义就是要有俩缓冲区(简称A和B)。这俩缓冲区,总是一个用于生产者进行输入缓存,另一个用于消费者进行输出读取。当俩缓冲区都操作完,再进行一次交替切换(先前被生产者写入的转为消费者读出,先前消费者读取的转为生产者写入)。以此实现生产者和消费者不会同时操作在同一个缓冲区,就避免了发生冲突,因此也不需要在读写每一个数据单元时都进行同步/互斥操作。双缓冲展现了空间换时间的优化思路。为了解决双缓冲问题,我们需要定义两个互斥锁(简称La和Lb),分别对应俩缓冲区。生产者或消费者如果要操作某个缓冲区,必须先拥有对应的互斥锁。Qt的双缓冲技术(doublebuffering)是Qt绘画机制的一部分,是一种在Qt4中被全面采用的技术。其核心是:把一个窗口部件渲染到一个脱屏pixmap(off-screenpixmap)中,然后再把这个pixmap复制到显示屏幕上。这样做的目的是用于消除屏幕的闪烁并且因而界面会显得更漂亮。Qt4中,Qt会自动处理这些情况,所以在普通的绘画中,我们不必要关注这些内容。在更详细的说明这一技术前,简单介绍一下Qt的绘画机制。Qt的绘画机制本质上是提供了2个工具:QPainter和QPaintDevice,分别代表人类世界的画笔和画板。Gemfield要完成一次绘画,就必须有个画笔(QPainter),另外,还得解决画笔画在哪儿(画板,QPaintDevice)的问题。Qt中的画板是QPaintDevice,当然,gemfield用到的都是它的子类,也就是具体哪种画板:它们是:QWidget、QImage、QPicture、QPixmap等,也就是每一个可见的控件(QWidget的子类)都是画板(在其paintEvent()里绘画)。双缓冲技术绘图当要绘制屏幕时,我们只要调用paint函数即可。其中我们可以使用绘图方法来绘制任何文字图形图像。可是当我们绘制的东西多了之后,你就会发现又是屏幕上的显示根本不是我们要的结果,很杂乱。我们知道,如果窗体在响应绘图消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。因为窗体在刷新时,总要有一个擦除原本图象的过程,此时程序会利用背景色填充窗体绘图区,然后再调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。因此,双缓冲区就提供了一个完美的解决方案。我们可以在缓冲区2中绘制图像,而是用缓冲区1来输出到屏幕。这样我们就可以控制绘制和现实的过程,从而避免上面的现象。双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:(1)在内存中创建与画布一致的缓冲区(2)在缓冲区画图(3)将缓冲区位图拷贝到当前画布上(4)释放内存缓冲区其实,在这样一个简单的绘图工作中,这样的技术大可不必。而且随着半导体技术的进步,双缓冲所能发挥出的功能相对减少。另外一个不容忽视的问题是,使用双缓冲技术会增加系统的负载。因为相比普通的绘制,它多出了一些工作。比如在SYSZUXpad上运行GemfieldFuwaArrow程序时,双缓冲时cpu的利用率是50%,而没有采用双缓冲时,cpu的利用率是37%。双缓冲和直接绘制的区别示意图如下:图2-1双缓冲绘图原理图

画图板项目需求分析可行性研究该阶段通过对系统目标的初步调研和分析,提出可行性方案并进行论证。我们在这里主要从技术可行性、经济可行性和操作可行性等方面进行分析。经济可行性开发该系统所需的相关资料可以通过对现已存在的相关系统进行调查采集,所需的应用软件、硬件系统也易于获得,因此开发成本较低。而引进使用本系统后,与传统方式相比,具有高效率、低成本、高质量的特点,可以节省不少人力、物力及财力。所以,从经济的角度来看,该系统可行。技术可行性技术可行性要考虑现有的技术条件是否能够顺利完成开发工作,软硬件配置是否能够满足开发需求等等。本系统使用JSP开发语言,调试相对简单,当前的计算机硬件配置也完全能够满足开发的需求,因此在技术上是绝对可行的。软件方面,由于目前单机模式相对发展成熟,故软件的开发平台成熟可行,它们速度快、容量大、可靠性能高、价格低,完全能满足系统的需求。本系统的开发,是典型的面向对象系统,采用Qt编程语言,已无技术上的问题。运行可行性运行可行性是对组织结构的影响、现有人员、机构和环境对系统的适应性以及人员培训补充计划的可行性。当前信息化技术已经相当普及,各类操作人员水平都有相当的高度,所以在运行上是可行的。时间可行性从时间上看,在两个月的时间里补充相关知识并完成系统的开发,虽然有些紧张,但却并非不可实现。通过这两个多月的不懈努力,系统功能已基本实现。法律可行性1所有技术资料都为合法。2开发过程中不存在知识产权问题。3未抄袭任何系统,不存在侵犯版权问题。4开发过程中未涉及任何法律责任。综上所述,本系统的开发从技术上、经济上、法律上都是完全可靠的。需求分析是一个软件的基础。如果没有正确的需求分析就不能做出满意的软件。所以可以说,需求分析是一个软件设计的灵魂。所以在任何系统开发之前,都用该进行相应的需求分析。需求分析的精准度越高,开发出来的程序稳靠行就越高,所需费用就会降低。反之,做出来的程序安全系数不高,还会增加开发费用,造成人力物力资源的严重浪费。功能分析我作的是Qtcreator下的画图板。在设计时需要考虑用户的需求和画图的习惯。例如习惯上的工具面板应该是竖排放置,而编辑菜单应该放置在横排。在进行具体的软件实际设计之前,应先对使用过程中用户可能需要并在本程序中应当实现的功能等进行整理,并列一个简要的提纲,如下:(1)画板新建功能:新建初始画板。(2)画板保存、另存为功能:在对画板进行编辑之后,可以选择保存或者另存为。(3)画板的打开功能:可以打开原来编辑并保存过的画板。(4)画板放大功能:图片可逐级放大尺寸。(5)画板缩小功能:图片可逐级缩小尺寸。(6)画板还原功能:画板通过不同尺寸的放大和缩小后,能够还原到初始新建的尺寸大小。(7)画板清空功能:画板可以在当前任何状态下进行对当前状态的清空,回到初始新建画板状态。(8)画板画图工具功能:画板可以实现选择图形、画笔线宽、画笔颜色等功能。(9)画板的图形选择功能:画直线、圆形、矩形、圆角矩形。(10)图片打开、编辑、保存功能:可以打开一些格式的图片,如png、bmp等,并且可以作为画板背景,在其做编辑并且保存Diagram。Diagram系统用例分打开保存打开保存新建清屏文件操作界面操作缩放用户自由绘图绘制基本图形颜色选择绘图线宽选择图3-1功能分析用例图

性能需求图3-1功能分析用例图为了保证系统能够长期、稳定、安全、可靠、高效地运行,系统处理的准确性和及时性是系统的必要性能。作为系统中很多数据的来源,本系统的添加功能对于整个系统的功能及性能举足轻重,其准确性和及时性很大程度上决定了系统的成败,因此在开发过程中,必须采用一定的方法保证系统的准确性和及时性。应用需求分析系统的性能要求通常是对系统需要的存储容量以及后援存储、重新启动和安全性、运行效率等方面的考虑。软件方面:通过虚拟机软件,你可以在一台物理计算机上模拟出另一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源等等。对于你而言,它只是运行在你物理计算机上的一个应用程序,但是对于在虚拟机中运行的应用程序而言,它就是一台真正计算机。因此,当你在虚拟机中进行软件评测时,可能系统一样会899.htm"崩溃;但是,崩溃的只是虚拟机上的操作系统,而不是物理计算机上的操作系统,并且,使用虚拟机的“Undo”[1](恢复)功能,你可以马上恢复虚拟机到安装软件之前的状态。虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响,而且具有能够在现有系统与虚拟镜像之间灵活切换的一类操作系统。虚拟系统和传统的虚拟机(Vmware,VirtualBox,Virtualpc)不同在于:虚拟系统不会降低电脑的性能,启动虚拟系统不需要像启动1.htm"windows系统那样耗费时间,运行程序更加方便快捷;虚拟系统只能模拟和现有操作系统相同的环境,而虚拟机则可以模拟出其他种类的操作系统;而且虚拟机需要模拟底层的硬件指令,所以在应用程序运行速度上比虚拟系统慢得多。流行的虚拟机软件有VMware(VMWareACE)、VirtualBox和VirtualPC,它们都能在Windows系统上虚拟出多个计算机。运行需求分析硬件条件:酷睿2CPU、1GRAM、10G以上硬盘的PC机。软件条件:装载ubantu虚拟机,Qtcreator。其他需求分析本系统具有较好的可维护性、可靠性、可理解性以及运行效率,易于用户理解和操作。可维护性包括了可读性、可修改性、可测试性等含义;可靠性则通常包括正确性和健壮性。在系统开发过程中,要于各种矛盾的目标之间作权衡,并要在一定的限制条件下(经费、时间、可用的软、硬件资源等),使上述各方面的需求得到最大限度的满足。

画图板概要设计画图板功能模块关系与划分功能模块是指数据说明、可执行语句等程序元素的集合,它是指单独命名的可通过名字来访问的过程、函数、子程序或宏调用。功能模块化是将程序划分成若干个功能模块,每个功能模块完成一个子功能,再把这些功能模块总合起来组成一个整体,以满足所要求的整个系统的功能。功能模块化的根据是,如果一个问题有多个问题组合而成,那么这个组合问题的复杂程度将大于分别考虑这个问题时的复杂程度之和。这个结论使得人们乐于利用功能模块化方法将复杂的问题分解成许多容易解决的局部问题。功能模块化方法并不等于无限制地分割软件,因为随着功能模块的增多,虽然开发单个功能模块的工作量减少了,但是设计功能模块间接口所需的工作量也将增加。本画图板的功能模块划分如图所示:编辑功能简易画图板画图功能图编辑文件编辑新建打开保存缩放清空线性非线自由绘图基本图形辅助选项颜色线宽铅笔刷子图4-1画图板功能模块图其中需要扩说明的部分有:在基本图形的绘制中有线性绘图和非线性绘图两个部分,此处在设计时我的想法是使用不同的事件响应机制来完成设计。即在绘制直线时使用mousePressEvent()和mouseReleaseEvent()。获得lastPoint和tempPoint两个首尾点,然后调用程序自带的drawLine()函数来完成绘制。而在绘制非线性图形时,此处实现的基本图形有:椭圆形,矩形,圆角矩形。此处使用mousePressEvent()和mouseMoveEvent()来完成绘制。

画图板总体设计流程图流程程序图是程序分析中最基本、最重要的分析技术,它是进行流程程序分析过程中最基本的工具。它运用工序图示符号对生产现场的整个制造过程做详细的记录,以便对零部件、w/1214.htm"产品在整个制造过程中的生产、加工、检验、储存等环节待作详细的研究与分析,特别适用于分析生产过程中的成本浪费,提高经济效益。本软件作为一个高度的面向对象的程序,其流程图相对简便,可以简化的概述为从画图板打开,画图或图片编辑,到关闭的整个过程。画图板文件操作整个过程如下图所示:开始开始结束退出程序NY新建一个画图板保存编辑好的图片文件是否保存YN是否打开已有图片绘制和修改图形新建或默认文件图4-2画图板文件操作程序流程图打开并读入已有图片初始化绘图区域结束退出程序NY新建一个画图板保存编辑好的图片文件是否保存YN是否打开已有图片绘制和修改图形新建或默认文件图4-2画图板文件操作程序流程图打开并读入已有图片初始化绘图区域鼠标左键弹起,响应函数mouseReleaseEvent()得到图形鼠标左键按下并移动,响应函数mouseMoveEvent()绘制图形鼠标左键按下,响应函数mousePressEvent()开始记录坐标点位置结束drawLine()drawElipse()矩形直线drawRect()椭圆默认值(w=1)选择线色选择线宽默认值(黑色)改变画笔属性定义并初始化shape参数记录形状color参数记录颜色width参数记录线宽开始改变画笔属性图4-3画图板画图功能流程图

画图板详细设计鼠标左键弹起,响应函数mouseReleaseEvent()得到图形鼠标左键按下并移动,响应函数mouseMoveEvent()绘制图形鼠标左键按下,响应函数mousePressEvent()开始记录坐标点位置结束drawLine()drawElipse()矩形直线drawRect()椭圆默认值(w=1)选择线色选择线宽默认值(黑色)改变画笔属性定义并初始化shape参数记录形状color参数记录颜色width参数记录线宽开始改变画笔属性图4-3画图板画图功能流程图画图板界面设计画图板的界面元素声明在画图板的界面设计中我没有使用QtDesigner等UI界面开发工具,而是选用的直接在Qtcreator中定义并实现了一个window类,它是继承于Qwidget的一个子类。在window类中我们首先使其继承于QMainWindow类,同时在类的定义中加入Q_Object宏。在window.h头文件中加入如下定义代码:classWindow:publicQMainWindow{Q_OBJECTpublic:Window(QWidget*parent=0);//window类的构造函数和析构函数~Window();voidcreateCommandToolBar();//声明命令工具栏,画图工具栏,和菜单栏voidcreatePaintToolBar();voidcreateMenus();其次我们在window.h中声明以下内容:界面布局声明的私有类型按钮对象声明的响应槽函数菜单栏按钮QToolBar*CommandToolBar;*newBtnnewSlot()*openBtnopenSlot()*saveBtnsaveSlot()*saveASBtnsaveAsSlot()*largeBtn;largeSlot()*smallBtnsmallSlot()*clearBtnclearSlot()定义在paint类*normalBtnnormalSlot()工具栏按钮QToolBar*PaintToolBar;*lineBtnlineSlot()*rectangleBtnrectSlot()*roundRectBtroundRectSlot()*ellipseBtnellipseSlot()*penBtnpenSlot()*brushBtnbrushSlot()*rubberBtnRubberSlot()*colorBtncolorSlot()*spinBoxspinBoxValueChanged(int)其次在声明中还应当注意的是:QSpinBoxspinBoxValueChanged(int)//在线宽的选择上采取spinBox来方便而精确的记录当前线宽,而不是用信号和槽机制进行响应QAction*saveAsAction;QAction*exitAction;//此处声明了两个动作PaintArea*paint;QScrollArea*scrollArea;//此处声明了两个自定义类的接口QStringfileName;//使用fileName来保存文件名以上我们完成了在window.h中的对于所有的对象和槽的声明。图板界面布局实现在声明过后,我们在对应的window.cpp中完成所有界面布局的定义:QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));//使用UTF-8字符集对文本编码进行转换:this->setWindowTitle(tr("画图"));//窗体标题this->setFont(QFont("Times",14));//设置程序字体this->resize(1024,576);//舒适的大小this->paint=newPaintArea;绘图区的初始化:scrollArea=newQScrollArea;//新建一个scrollArea控件scrollArea->setBackgroundRole(QPalette::Dark);//设置背景色为灰色scrollArea->setWidget(paint);//将绘图区放在scrollArea控件中scrollArea->widget()->setMinimumSize(3500,2600);//scrollArea初始化大小为3500*2600this->setCentralWidget(scrollArea);//scrollArea控件添加到主窗口接下来完成所有按钮的定美化和布局,此处不列举所有功能代码,我们以“新建”绘图按钮为例:第一步:newBtn=newQPushButton(tr("新建"));//新建按钮newBtn->setFont(QFont("Times",14));//设置字体newBtn->setIcon(QIcon(":/image/new.png"));//为按钮设置图标素材newBtn->setIconSize(QSize(25,25));//更改按钮图标的大小newBtn->setFlat(true);//设置图标的立体效果状态第二步:voidWindow::createCommandToolBar(){this->CommandToolBar=newQToolBar;//新建命令工具栏CommandToolBar->addWidget(newBtn);//将新建按钮添加进工具栏第三步:connect(newBtn,SIGNAL(clicked()),this,SLOT(newSlot()));//按钮点击触发事件对于newBtn和newSlot()建立连接,应用信号和槽机制的关键步骤最终完成界面的设计如下图所示:图5-1画图板界面展示此处我使用了许多自己在网上寻找的素材图片来对于整个界面进行美化:图5-2图标素材展示画图板功能详细设计在画图板的界面布局安排好以后,我们开始设计完成画图板的基本功能,根据我们所画的功能模块图的分布思想来完成以下代码编辑:画图板的文件编辑功能实现首先介绍画图板的新建功能实现:画图板的新建功能实现定义在newSlot槽函数中:voidWindow::newSlot(){Window*m=newWindow;//新建功能是通过重新new一个MyWindow对象来实现的。m->show();//新建的对象调用show()函数来显示出来,}实现效果如图所示:图5-3新建功能实现截图在中定义“打开”槽函数voidWindow::openSlot(){this->fileName=QFileDialog::getOpenFileName(this,tr("南茜"));paint->openImage(fileName);在paint.cpp中实现打开功能:/*打开图片文件*/boolPaintArea::openImage(constQString&filename){QImageloadImage;if(!loadImage.load(filename))第二部分介绍画图板的打开功能实现:returnfalse;QSizenewsize=loadImage.size();//获得图片的尺寸setImageSize(newsize.width(),newsize.height());//根据加载图片的尺寸,通过调用setImageSize()函数重新设置Image的尺寸Image=loadImage;//把QImage对象loadImage加载的图像放到已经设置好的Image上update();//主动调用update()函数,触发paintEvent()事件,进行界面重绘returntrue;}图5-4打开功能实现截图第三部分介绍画图板的保存功能实现:画图板的保存功能槽函数:voidWindow::sa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论