基于QT的计算器设计.doc_第1页
基于QT的计算器设计.doc_第2页
基于QT的计算器设计.doc_第3页
基于QT的计算器设计.doc_第4页
基于QT的计算器设计.doc_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

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

文档简介

1. 应用需求分析设计一个功能齐备的QT科学计算器,具有算式编辑计算和普通计算窗口。具体要求如下:可实现大中小括号和加减乘除运算,显示当前日期时间。1.1 题目要求1) 能单独的进行简单的四则运算;2) 能进行包含括号在内的算术表达式运算(能检查表达式是否合法);3) 能有算术逻辑错误提示(例如除数不能为0之类);4) 界面要求简洁美观,容易用户操作。1.2 项目特点及意义本文对计算器进行设计,比传统计算其增加了许多功能,使用更方便,主要有以下几个特点:1) 计算速度快,节省时间、人力2) 普通窗口可以进行十进制的加减乘除运算。3) 能进行包括括号在的算术表达式计算,4) 有帮助功能,可以通过查询查询个按键的功能,可以对按键功能添加、删除。 5) 提供良好的人机交互界面,操作简单快捷。2. 应用系统总体结构设计描述2.1 功能需求在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。在程序设计中,可以用两种方法解决问题:一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。而在面向对象程序设计中关键是如何将问题域中的实体(即日常所见的概念)抽取出来,作为C+程序中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还应考虑类必须满足的约束。我们日常生活的开支,大额数字或是多倍小数的计算都需要计算器的帮助,处理数字的开方、正余弦都离不开计算器。虽然现在的计算器价格比较低廉,但是功能过于简单的不能满足个人需求,功能多的价格较贵,操作不便不说,很多功能根本用不到。所以,我们想到可不可以用自己的所学为自己设计开发一个属于自己的简单计算器来完成日常生活的需求。计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除、开方、求倒数等简单运算的工具。要实现计算功能,可以用C+和Qt的知识编写程序来解决此问题。该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。本文的程序设计设计工作环境为Linux +QT Creator ,在程序设计中,采用了结构化与面向对象两种解决问题的方法。2.2 功能分析普通窗口计算设计,要求进行加减乘除运算。支持十进制数据的直接输入和计算当输入回车键或等号键时直接给出当前算式的运算结果,算式计算和编辑可同时交叉进行,设置中间变量,方便运算过程中中间数据的存储或提取插入。2.3可行性分析计算器是日常生活中非常便捷有效的工具,它具有普通计算和科学计算,能实现加减乘除等普通功能,还可以实现算是运算,并且可以进行进制装换,不再局限于十进制,他大大的提高了我们的效率,节省了时间,可促进科技的发展,还可以用来存储算式,可以方便下次使用,采用Qt编写,Qt designer设计的界面美观,还可以用拖拽功能进行设计控件的位置、大小、属性、结构等功能,这样在编写代码时就不用浪费时间对控件进行声明等代码了。这降低了程序员的难度,提高了程序员的效率,并且上手快,具有一定的可行性。在技术上,主要是采用linux,可以进行复杂的数据库操作,进行算是的增、删、改、查等功能。用Qt编写,有些类似C+,但大多数都是Qt封装好的函数。在linux中安装Qt软件,配置环境变量,并安装Qt插件。从而用Qt 进行制作界面,做出的效果既美观又快捷方便。使用Qt具有良好美观的界面,必要的信息存储和和较好的健壮性,使用人员能够快捷简单的进行操作,可以快捷的获得计算结果,给人们带来方便,对人们的生活有很大的帮助。2.4 系统设计工具2.4.1 fedora技术简介Fedora (第七版以前为Fedora Core)是一款基于 Linux 的操作系统,也是一组维持计算机正常运行的软件集合。Fedora 由Fedora Project社区开发、红帽公司赞助,目标是创建一套新颖、多功能并且自由和开源的操作系统。Fedora 项目以社区的方式工作,引领创新并传播自由代码和内容,是世界各地爱好、使用和构建自由软件的社区朋友的代名词。Fedora基于Red Hat Linux,在Red Hat Linux终止发行后,红帽公司计划以Fedora来取代Red Hat Linux在个人领域的应用,而另外发行的Red Hat Enterprise Linux(Red Hat企业版Linux,RHEL)则取代Red Hat Linux在商业应用的领域。Fedora的功能对于用户而言,它是一套功能完备、更新快速的免费操作系统,而对赞助者Red Hat公司而言,它是许多新技术的测试平台,被认为可用的技术最终会加入到Red Hat Enterprise Linux中。2.4.2 Qt技术介绍QT 是一个跨平台的 C+ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上。支持 Linux 平台。伴随着 KDE 的快速发展和普及,QT 很可能成为 Linux 窗口平台上进行软件开发时的 GUI 首选。使用Qt开发的软件,可以在任何支持的平台上编译与运行,而不需要修改源代码。可以实现本平台的图形界面风格,也可实现其它平台的图形界面风格。比如可以在Microsoft Windows平台下编译出具有苹果公司Mac OS图形界面风格的应用程序。经过多年发展,Qt不但拥有了完善的C+图形库,而且近年来的版本逐渐集成了数据库、OpenGL库、多媒体库(Phonon)、网络库、脚本库、 XML库、WebKit库等等,其内核库也加入了进程间通信、多线程等模块,极大的丰富了Qt开发大规模复杂跨平台应用程序的能力,真正意义上实现了其研发宗旨“Code Less; Create More; Deploy Anywhere.”。Qt中使用了C+的非标准扩展,用在编译前增加一个名为moc的预处理器来实现,moc将Qt代码处理成标准C+代码。Qt开放源代码,并且提供自由软件的用户协议。使得它可以被广泛地应用在各平台上的开放源代码软件开发中。 2009 年5月11日,诺基亚Qt Software 宣布 Qt源代码管理系统面向公众开放,Qt 开发人员可通过为 Qt 以及与 Qt 相关的项目贡献代码、翻译、示例以及其他内容,协助引导和塑造 Qt未来的发展。为了便于这些内容的管理,Qt Software 启用了基于 Git 和 Gitorious 开源项目的Web 源代码管理系统。在推出开放式 Qt 代码库的同时,Qt Software 在其网站发布了其产品规划(Roadmap)3. 软件实现由于计算器的工作状态是,一直在等待外界的操作,类似于一直在执行循环跳转指令等待系统中断。因此,中断的设计对于计算器软件的设计就显得至关重要,在介绍计算器具体功能之前先引入信号和槽两个重要的概念。3.1 信号和槽信号和槽作为QT的核心机制在QT编程中有着广泛的应用, 信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,他是QT的核心特性,也是QT差别于其他工具包的重要地方。信号和槽是QT自行定义的一种通信机制,他独立于标准的C/C+语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是个C+预处理程式,为高层次的事件处理自动生成所需要的附加代码。 在我们所熟知的非常多GUI工具包中,窗口小部件(widget)都有一个回调函数用于响应他们能触发的每个动作,这个回调函数通常是个指向某个函数的指针。不过,在 QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程式更为简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生core dumps。 所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改动其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,他不知道另一端是谁在接收这个信号。这就是真正的信息封装,他确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但他们是普通的对象成员函数。一个槽并不知道是否有所有信号和自己相连接。而且,对象并不了解具体的通信机制。 你能将非常多信号和单个的槽进行连接,也能将单个的信号和非常多的槽进行连接,甚至于将一个信号和另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将即时发射第二个信号。总之,信号和槽构造了一个强大的部件编程机制。3.1.1信号当某个信号对其客户或所有者发生的内部状态发生改动,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,和其相关联的槽将被即时执行,就象一个正常的函数调用相同。信号-槽机制完全独立于所有GUI事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽和某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,不过他们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。 信号的声明是在头文件中进行的,QT的signals关键字指出进入了信号声明区,随后即可声明自己的信号。例如,下面定义了三个信号: signals: void mySignal(); void mySignal(int x); void mySignalParam(int x,int y); 在上面的定义中,signals是QT的关键字,而非C/C+的。接下来的一行void mySignal() 定义了信号mySignal,这个信号没有携带参数;接下来的一行void mySignal(int x)定义了重名信号mySignal,不过他携带一个整形参数,这有点类似于C+中的虚函数。从形式上讲信号的声明和普通的C+函数是相同的,不过信号却没有函数体定义,另外,信号的返回类型都是void,不要指望能从信号返回什么有用信息。 信号由moc自动产生,他们不应该在.cpp文件中实现。 3.1.2槽 槽是普通的C+成员函数,能被正常调用,他们唯一的特别性就是非常多信号能和其相关联。当和其关联的信号被发射时,这个槽就会被调用。槽能有参数,但槽的参数不能有缺省值。 既然槽是普通的成员函数,因此和其他的函数相同,他们也有存取权限。槽的存取权限决定了谁能够和其相关联。同普通的C+成员函数相同,槽函数也分为三种类型,即public slots、private slots和protected slots。 public slots:在这个区内声明的槽意味着所有对象都可将信号和之相连接。这对于组件编程非常有用,你能创建彼此互不了解的对象,将他们的信号和槽进行连接以便信息能够正确的传递。 protected slots:在这个区内声明的槽意味着当前类及其子类能将信号和之相连接。这适用于那些槽,他们是类实现的一部分,不过其界面接口却面向外部。 private slots:在这个区内声明的槽意味着只有类自己能将信号和之相连接。这适用于联系非常紧密的类。槽的声明也是在头文件中进行的。下面在头文件mainwindow.h中声明了三个槽: private slots: void button0(); void button1(); void button2(); void button3(); void button4(); void button5(); void button6(); void button7(); void button8(); void button9(); void buttonpoint(); void buttonplus(); void buttonsubstact(); void buttonmultiply(); void buttonexcept(); void buttonclear(); void buttondismantle(); void buttonequal(); void buttonleft(); void buttonright(); void buttonTime(); void buttonClose(); void postfix(char e,char f); double evalpost(char f); double readnumber(char f,int *i); int is_operation(char op); int priority(char op);3.1.3 信号和槽的关联 通过调用QObject对象的connect函数来将某个对象的信号和另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下: bool QObject:connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) static 这个函数的作用就是将发射者sender对象中的信号signal和接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者和接收者属于同一个对象的话,那么在connect调用中接收者参数能省略。信号和槽构成了QT环境下的软见中断机制。 在mainwindow.cpp中构造函数中进行信号于槽的链接,也就是各按键及工具条等组件的动作响应关系(函数)如下:connect(ui-Button0,SIGNAL(clicked(),this,SLOT(button0(); connect(ui-Button1,SIGNAL(clicked(),this,SLOT(button1(); connect(ui-Button2,SIGNAL(clicked(),this,SLOT(button2(); connect(ui-Button3,SIGNAL(clicked(),this,SLOT(button3(); connect(ui-Button4,SIGNAL(clicked(),this,SLOT(button4(); connect(ui-Button5,SIGNAL(clicked(),this,SLOT(button5(); connect(ui-Button6,SIGNAL(clicked(),this,SLOT(button6(); connect(ui-Button7,SIGNAL(clicked(),this,SLOT(button7(); connect(ui-Button8,SIGNAL(clicked(),this,SLOT(button8(); connect(ui-Button9,SIGNAL(clicked(),this,SLOT(button9(); connect(ui-ButtonPoint,SIGNAL(clicked(),this,SLOT(buttonpoint(); connect(ui-ButtonPlus,SIGNAL(clicked(),this,SLOT(buttonplus(); connect(ui-ButtonSubstact,SIGNAL(clicked(),this,SLOT(buttonsubstact(); connect(ui-ButtonMultiply,SIGNAL(clicked(),this,SLOT(buttonmultiply(); connect(ui-ButtonExcept,SIGNAL(clicked(),this,SLOT(buttonexcept(); connect(ui-ButtonClear,SIGNAL(clicked(),this,SLOT(buttonclear(); connect(ui-ButtonDismantle,SIGNAL(clicked(),this,SLOT(buttondismantle(); connect(ui-ButtonEqual,SIGNAL(clicked(),this,SLOT(buttonequal(); connect(ui-ButtonLeft,SIGNAL(clicked(),this,SLOT(buttonleft(); connect(ui-ButtonRight,SIGNAL(clicked(),this,SLOT(buttonright(); connect(ui-ButtonTime,SIGNAL(clicked(),this,SLOT(buttonTime(); connect(ui-ButtonClose,SIGNAL(clicked(),this,SLOT(buttonClose();3.2界面设计界面设计我们是使用Qt creator进行设计的,首先创建一QMainWindow(parent).ui,这个界面为QWidget。然后在左侧的Widget Box找相应的控件添加到QMainWindow(parent)里。首先提出一个lineEdit控件作为算式显示窗口和结果显示窗口,在提取出30个QpushButton为0到9按键和加减乘除按键、小数点按键、等于按键。然后再把各个pushButton名字改成相应的符号,并且改对应pushbutton的属性,保存后取Qt creator编译QMainWindow(parent).ui,运行程序就可以显示相应界面。3.1 计算器图形界面3.3 程序具体实现这里仍使用信函和槽连接机制,我们没有使用信号和槽编辑器,而是直接在.cpp文件中添编写其代码来实现,首先在.h文件中对各个按键进行声明,再到.cpp文件中编写相应的代码实现其功能。计算器实现了加,减,乘,除基本运算,以及括弧、连乘、连加、连除、清零和显示时间等功能。下面将对一些核心算法进行说明。考虑到程序中出现了众多信号与槽的链接,故采用手工链接的方式进行。在mainwindow.h窗口中声明了如下槽函数:我们必须弄得一般计算器button键的工作原理,而这部分,在Qt事例中用详细的说明,这里我们就不必指出。考虑到表达式和简单的区别,我们分两种情况进行编写。当然,在后续的函数中,这种分别讨论的情况是经常出现的, 当然,对上面的理解可以从这个角度来看。因为我们要实现表达式运算,而对于表达式运算的实现,最主要的不是各个功能键的实现,而是对数据的储存和对左右括号的判断。这个可以从以前学习数据结构中的栈进行联系。当然,我们必须承认这个过程的程序编写是有难度的,它不仅考察各人的程序编写能力,同时也考察了我们逻辑思维方面的能力。让我们看到了Qt 在String上较比C+的飞速进步,让我们抛弃了原有的思路(当然,这是飞跃,应该提倡)。当然,要理解表达式计算器的设计思想,还是要从最初的方法来讲。3.3.1 数字响应以button0为例,在输入之前的值为0,则对total依然赋值为0,若之前的值不为0,将之前的值保存在变量number中,然后将0添加到total后面。对于其余数字的响应采用同样的方式。在mainwindow.cpp中添加源代码如下所示:void MainWindow:button0() if(total=0) total=0; else number=ui-textEdit-toPlainText(); total.append(0); ui-textEdit-setText(total);3.3.2 小数点的响应void MainWindow:buttonpoint() number=ui-textEdit-toPlainText(); temp=number.right(1); if(temp=+ | temp=- | temp=* | temp=/ | temp=() QMessageBox:warning(this,tr(输入错误),tr(错误!请重新输入!); return; if(temp=. ) QMessageBox:warning(this,tr(输入错误),tr(错误!请重新输入!); return; total.append(.); ui-textEdit-setText(total);在输入之前先要进行错位判断,若为合法的输入才在表达式中添加小数点,在进行小数的计算时,输入第一个小数若紧跟在运算符后面的不是数字则会报错,如下图:图3-23.3.3 显示系统时间void MainWindow:buttonTime() QTimer *timer=new QTimer(this); timer-start(1000); QDateTime time = QDateTime:currentDateTime(); /获取系统现在的时间 QString str = time.toString(yyyy-MM-dd hh:mm:ss dddd); connect(timer,SIGNAL(timeout(),this,SLOT(buttonTime(); connect(ui-ButtonClear,SIGNAL(clicked(),timer,SLOT(stop(); /设置系统时间显示格式 ui-textEdit-setText(str);运行的效果见后面功能测试一节3.3.4 括号以及表达式的运算当然,对上面的理解可以从这个角度来看。因为我们要实现表达式运算,而对于表达式运算的实现,最主要的不是各个功能键的实现,而是对数据的储存和对左右括号的判断。这个可以从以前学习数据结构中的栈进行联系。当然,我们必须承认这个过程的程序编写是有难度的,它不仅考察各人的程序编写能力,同时也考察了我们逻辑思维方面的能力。所以,通过学习QT编程技术,让我们看到了Qt 在String上较比C+的飞速进步,让我们抛弃了原有的思路(当然,这是飞跃,应该提倡)。当然,要理解表达式计算器的设计思想,还是要从最初的方法来讲,如图所示:以上程序具体只是为我们开辟了表达式计算器实现的可能,具体的计算实现过程见代码,这里就不指出。4. 系统调试及性能分析4.1 调试环境介绍本节主要介绍怎样在fedora10下搭建QT creator的开发环境。1、把下载的qt-creator-linux-x86-opensource-1.3.1.bin文件拷到一个目录(如/root/tmp目录)2、进入目录/root/tmp设置qt-creator-linux-x86-opensource-1.3.1.bin文件为可执行#chmod +x qt-creator-linux-x86-opensource-1.3.1.bin3、安装:# ./ qt-creator-linux-x86-opensource-1.3.1.bin启动安装界面,默认Next即可。2.2 Qt-creator开发环境的配置1、启动Qt-creator。2、在Qt-creator菜单栏Tools-Options打开Options窗口。3、在Options界面左侧,点击Qt4-Qt Versions右侧显示Qt Versions设置界面。4、在Qt Versions界面中点击那个蓝色的大“”号图标5、在下方Version Name,文本框内输入Qt的版本名,区分各个版本即可(如pc版取Qt4.6.3-pc、x86版取QtE4.6.3-x86、arm版取QtE4.6.3-arm)。单击Qmake Location,右侧Browse按钮,在弹出的“Select QMake Executable”窗口中找到对应版本的qmake程序(按照我们前面安转的,pc版路径:/usr/local/Trolltech/Qt-4.6.3/bin/qmake,x86版路径:/usr/local/Trolltech/QtEmbedded-4.6.3/ bin/qmake,arm版路径:/usr/local/Trolltech/QtEmbedded-4.6.3-arm/bin/qmake),单击打开, 回到Qt Versions界面,单击Debugging Helper,右侧Rebuild按钮,等待片刻,看到Debugging Helper,后出现一个绿色的“”即可。同理完成其他版本的添加。添加完毕,单击OK按钮关闭Options窗口。到此,Qt-creator配置完毕。2.2 示例从usr/local/Trolltech/QtEmbedded-4.6.3/demos下复制books例程到root/tmp文件夹下。启动Qt-creator,File-Open File or Project,打开root/tmp/books/。这里分两部分,首先编译x86下的,并运行在qvfb下,再编译arm下的,移到开发板下运行。2.2.1 x86下的编译与调试在Qt-creator界面左侧点击Projects图标,打开工程设置界面,执行如下操作:1、配置:在Edit Project Settings for Project books-Build Settings-Edit Build Configuration;单击Add,在下拉列表中选择Using Qt Version “QtE4.6.3-x86”弹出对话框单击Ok按钮,在Edit Bu

温馨提示

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

评论

0/150

提交评论