当前位置:首页 >> 工学 >>

迷你计算器2


《嵌入式系统》课程设计说明书

迷你计算器


指导教师 课题名称

学生姓名

迷你计算器设计

一、目标 在 GEC210 开发板上使用 QT 设计一个迷你计算器。 二、任务 根据控制要求,明确设计任务,拟定设计方案与进度计划,运用所学的理论知识, 进行迷你计算器原理设计、程序框架设计、创新设计,提高理论知识、系统调试能力、 分析问题与解决问题的能力。主要内容包括: 1. 嵌入式交叉开发环境搭建。 2. Linux 操作系统的移植。 3. 根据需求确定外围模块设计并完成相应驱动开发。 4. 应用程序原理及框架设计。 5. Linux 下应用程序编写及移植。 内 容 及 任 务 6. 系统总体功能调试。 7. 编写设计说明书。 三、要求 1.迷你计算器的功能显示界面示例如下:

2.能够完成十进制数的加、减、乘、除等简单计算。 3.对不正确的表达式能指出其错误。

I

[1]马忠梅,ARM & Linux 嵌入式系统教程(第 3 版)[M] 。北京:北京航空航天大学出版 社,2014 主 要 参 考 资 料 [2]曹忠明,程姚根。从实践中学嵌入式 Linux 操作系统[M] 。北京:电子工业出版社, 2012 [3]宋宝华,Linux 设备驱动开发详解(第二版) [M] 。北京:人民邮电出版社,2010。 [4]韦东山,嵌入式 Linux 应用开发完全手册[M] 。北京:人民邮电出版社,2008 [5] 陆文周,Qt5 开发及实例[M] 。北京:电子工业出版社,2015 [6] Stephen Prata,C Primer Plus[M] 。北京:人民邮电出版社,2005

教 研 室 意 见

教研室主任: (签字) 年 月 日

II





嵌入式操作系统(Embedded Operating System)是一种用途广泛的系统软件,通 常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形 界面、标准化浏览器等。嵌入式操作系统负责嵌入式系统的全部软、硬件资源的 分配、任务调度,控制、协调并发活动。它必须体现其所在系统的特征,能够通 过装卸某些模块来达到系统所要求的功能。 目前在嵌入式领域广泛使用的操作系 统有:嵌入式实时操作系统 ?C/OS-II、 嵌入式 Linux、 Windows Embedded、 VxWorks 等,以及应用在智能手机和平板电脑的 Android、iOS 等。 Qt 是一个跨平台的 C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用 户界面所需的所用功能。 Qt 是完全面向对象的很容易扩展并且允许真正地组件编程。且具备面向对象、 丰富的 API、 强大的类等优点这将为我们提供图形化编程的便利。本次我们在课 程设计中所做的是基于 QTGUI 的计算器的设计与实现。计算器(calculator; counter)一般是指“电子计算器” ,计算器是能进行数学运算的手持机器,拥有 集成电路芯片,其结构简单,比现代电脑结构简单得多,可以说是第一代的电子 计算机(电脑) 。计算器这一小小的程序机器实际上是从计算机中割裂出来的衍 生品,虽然功能较单一,但因其操作模式的方便快捷和价格的低廉,携带方便等 特点,已经被广泛应用于工程、学习、商业贸易等日常生活中,极大的方便了人 们对于数字的整合运算, 成为人们生活和办公中的必备品之一,计算器的小巧精 致的外观和多功能化的发展依旧在当今信息电子化的时代扮演者不可替代的角 色. 关键词 :嵌入式操作系统、Linux 操作系统、Qt、电子计算器

III


1



设计前提 .............................................. 1 1.1 Linux 下 Qt 编写的的计算器特点 ..................... 1 1.2 Linux 下 Qt 编写的的计算器的功能需求 ............... 2 本次设计的计算器应具有以下功能:? .................... 2

2 开发环境的简介于搭建.................................... 3 2.1 开发环境 ......................................... 3 2.1.1 Linux 简介................................... 3 2.1.2 QT 简介...................................... 3 2.2 Qt 环境搭建....................................... 4 3 设计流程 ............................................... 6 3.1 系统流程图 ....................................... 6 3.2 模块划分 ......................................... 6 3.3 模块设计 ......................................... 7 3.3.1 界面显示模块 ................................ 7 3.3.2 基本功能模块 ................................ 8 3.3.3 记忆存储功能模块 ........................... 12 4 运行于结果分析 ....................................... 13 4.1 运行 ............................................. 13 4.2 结果分析 ........................................ 14 参考文献 ................................................ 16 致 谢 .................................................. 17 附 录 .................................................. 18

1

设计前提

1.1 Linux 下 Qt 编写的的计算器特点
本次设计是采用 Qt 编写的一个计算器程序。 Qt 是完全面向对象的很容易扩 展并且允许真正地组件编程。所以这次编写的电子钟采用 C++编程中的结构是面 向对象的有利于模块化和扩展对于后期功能的添加修改具有很良好的 支持 Linux 操作系统下的图形用户界面工具包 Qt 通过编写 Qt 代码结合一些算法机制 来达到实现计算器的目的。 我们日常生活的开支, 大额数字或是多倍小数的计算都需要计算器的帮助, 处理数字的开方、正余弦都离不开计算器。虽然计算器现在价格比较低廉,但是 功能过于简单的不能满足个人需求,功能多的价格昂贵,操作不便不说,很多功 能根本用不到。 所以,我们可以运用自己所学的知识设计一款满足日常需求的简 易计算器。 在本次课程设计中比较好的把 C++与 Qt 结合起来使用。Qt 作为面向对象的 软件开发工具?它使用信号 Signal/槽 slot 机制来进行对象间的通信。信号/槽 机制是 Qt 的一个中心特征并且也许是 Qt 与其它工具包的最不相同的部分。Qt 运行速度快、 执行效率高再加上它提供了一组更容易理解的 GUI 类信号与槽易使 用它所拥有的插入体系结构使得我们可以将代码加载到一个应用中而无需进行 重新编译或重链接等优点为我们本次设计增色不少能使图形界面看起来更加舒 服使用起来更加灵活。

1

1.2Linux 下 Qt 编写的的计算器的功能需求
在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语 法及语义分析原理的理解,并实现对命令语句的灵活运用。在程序设计中,可以 用两种放法解决问题: 一是传统的结构化程序设计方法,二是更先进的面向对象 程序设计方法。 而在面向对象程序设计中关键是如何将问题域中的实体(即日常 所见的概念)抽取出来,作为 C++中的类,而属性与行为作为类的两类要素通常 是必不可少的,甚至还考虑类必须满足的约束,我们选择的是第二类实现方法, 采用结构化与面向对象两种解决问题的方法。 本次设计的计算器应具有以下功能:? (1)能够实现常用的加减乘除功能; (2)能够实现开方,乘方,返回的功能; (3)定能够实现数值的记忆存储功能? (4)当输入错误时,输出错误; (5)可以一键回复计算器到初始状态.

2

2 开发环境的简介于搭建

2.1 开发环境
2.1.1 Linux 简介

Linux 是一个多用户、多任务的类 UINX 操作系统,以系统的稳定性和强大的网 络功能而著称。目前,Linux 系统主要被应用到:桌面应用、服务器、软件开发 和嵌入式领域。在安装系统时,可以自行定制相关的开发工具。Linux 发展到今 天,已经拥有了很完善的开发环境。例如:gcc、gdb、make 等。 Linux 的发行版本有 RadHat、Debian、Ubuntu。 RadHat 是目前世界上最资深的 Linux 和开放源代码提供商,同是也是最获 得认可的 Linux 品牌之一。支持多硬件平台,拥有优秀的安装界面,独特的 RPM 升级方式。 Debian 最早由 Ian Murdock 于 1993 年创建。它的开发模式与 Linux 及其它 开放性源代码操作系统精神一样, 都是由超过 800 位志愿者通过互联网合作开发 而成的。一直以来,Debian 被认为是最正宗的 Linux 发行版本,而且它是完全 免费的、高质量的与 Unix 兼用的操作系统。 Ubuntu 是相对较新的发行版。但是,它的出现改变了许多潜在用户对 Linux 安装和使用困难的看法,因为 Ubuntu 安装方便,简单易用。Ubuntu 被称为对硬 件支持最好、 最全面的 Linux 发行版之一,许多在其它发行版上无法使用或者默 认配置时无法使用的硬件在 Ubuntu 上都可以使用。 在 Linux 桌面系统的发行版当中,我们选择了 Ubuntu12.04 LTS,因为它安 装傻瓜化,而且桌面环境简单友好,易用性强,为 Linux 入门者降低了不少门 槛。 但是为了不让电脑主机系统因意外或人为操作不慎导致其崩溃、破环原有系 统,我们的建议是在虚拟主机环境下玩耍 Ubuntu。

2.1.2

QT 简介 Creator 所设计的,先介绍下 QT 开发工具的

由于本次设计的程序是用 QT

背景。Qt 是一个 1991 年由奇趣科技开发的跨平台 C++图形界面应用程序开发框 架。它既可以开发 GUI 程式,也可用于开发非 GUI 程式,比如控制台工具和服务 器。Qt 是面向对象语言,易于扩展,并且允许组件编程。QT 所具有的优势是: 优良的跨平台特性, Qt 支持下列操作系统:Microsoft Windows 95/98, Microsoft Windows NT,Linux, Solaris, SunOS, HP-UX, Digital
3

UNIX

(OSF/1, Tru64),

Irix,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX 等等。面向对象:Qt 的良好封 装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使 得各个元件之间的协同工作变得十分简单。丰富的 API: Qt 包括多达 250 个以上 的 C++类, 还提供基于模板的 collections, serialization, file, I/O 支持 2D/3D 图形渲染,支持 OpenGL 大量的开发文档。 device, directory management,date/time 类。甚至还包括正则表达式的处理功能。

2.2 Qt 环境搭建
本次报告所编写的拼图小游戏是在 LINUX 环境下使用 QT4.6 编写完成的而 LINUX 操作系统我选择的是 red hat 9.0 这就涉及到怎样在 red hat 下安装 QT 和使用 QT 实现计算器的功能。 在 red hat 下搭建 QT 的编译环境如下: 1:下载 Qt 4.5.2 for X11 OpenSource 版。 2:下载过来的是 qt-x11-opensource-src-4.5.2.tar.gz 文件用 tar 命令 解压一下。 tar zxvf qt-x11-opensource-src-4.5.2.tar.gz 3:把这个目录移到/usr/local 目录下?改名为 qt。 4:修改?可以使用 vi 编辑器或者 gedit ?自己目录下的.bash_profile 或 者 .profile 或者是/etc/profile 这个文件?加入下面的代码? QTDIR=/usr/local/qt PATH=$QTDIR/bin:$PATH MANPATH=$QTDIR/man:$MANPATH LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export QTDIR PATH MANPATH LD_LIBRARY_PATH 5:注销一下用户或者 source .bash_profile 一下?使配置文件生效。 6:进入 QT 的目录?开始编译 ./configure 输入 yes 同意 GPL/QPL 协议。 7:开始 make 这步要一两个小时 make 8:开始 install make install 9:进入 QT 的目录?进入 bin 目录?然后运行 ./designer ?就可以看到图形界
4

面了. Qt Designer 界面如图 5 所示:

图 5: Qt 界面

5

3 设计流程

3.1 系统流程图
系统流程图如下所示:

图 1: 系统流程图

3.2 模块划分
程序主要有分为两大部分 : 一是界面显示模块 ;二是逻辑功能实现模块 . 其 中功能模块又分为两部分 .一是基本功能模块,即加减乘除,清除退格功能;另一 部分是额功能模块,包括求开方,乘方,倒数,负数功能和数据存储记忆功能.本人 负责的是数据存储记忆功能,另一组员负责剩余额外功能模块. 模块结构图 2 如下所示:

6

图 2: 模块结构图

3.3 模块设计
3.3.1 界面显示模块 计算器界面如图 3 所示:

图 3:计算器界面

计算器界面主要有一个 widgets 窗口和一个 LineEdit 部件及若干个 Button 部件 组成.界面设计中最重要的是界面的布局.由于大部分窗口部件为按钮.固定义了 一个 button 类,专为生成统一风格的按钮所用. 程序中创建的 Button 类继承自 QToolButton 类.类中方法主要功能为定义按 钮的类型,大小策略及按钮的文本显示方式 . 构造函数中的 setSizePolicy()是 按钮可以水平扩展的方式去填补界面的空缺 .如果没有这个方法,创建不同的按 钮将会显示不同的宽度 . 在 sizeHint() 方法中 . 我们把 height 设置为在默认 QToolButton 大小的基础上增加了 20,设置 width 至少和 height 一样大.这样就 保证了按钮可以按照表格布局一样整齐分布在 Dialog 中.如果没有 sizeHint(), 界面布局将如图 4 所示:

7

图 4:界面布局

3.3.2 基本功能模块 1)当用户单击"+"或"-"按钮时,系统将会调用 additiveOperatorClicked() 槽,additiveOperatorClicked()实现代码如下: void Widget::additiveOperatorClicked() { QPushButton *clickedButton = qobject_cast<QPushButto*>(sender()); QString clickedOperator = clickedButton->text(); double operand = ui->display->text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation(); return; } ui-> display->setText(QString::number(factorSoFar)); operand = factorSoFar;
8

factorSoFar = 0.0; pendingMultiplicativeOperator.clear(); } if (!pendingAdditiveOperator.isEmpty()) { if (!calculate(operand, pendingAdditiveOperator)) { abortOperation(); return; } ui->display->setText(QString::number(sumSoFar)); } else { sumSoFar = operand; } pendingAdditiveOperator = clickedOperator; waitingForOperand = true; } 进入这个函数后,会根据 QPushButton *clickedButton =qobject_cast<QPushButto*>(sender()); 这句代码实现区分+还是-, 并且判断存储前运算符变量中是否有值,如果有则将 前面的值先算出。如果没有,则将第一个值存入,并将运算符存入。并且继续等 待接下来的按钮,或者等号。 2)当我们单击"×"或"÷"按钮时,系统将调用 void Widget::multiplicativeOperatorClicked() { QPushButton *clickedButton = qobject_cast<QPushButton *>(sender()); QString clickedOperator = clickedButton->text(); double operand = ui->display->text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation(); return;
9

} ui->display->setText(QString::number(factorSoFar)); } else { factorSoFar = operand; } pendingMultiplicativeOperator = clickedOperator; waitingForOperand = true; } 由于乘除的优先级比加减高,当我们进行混合运算,前面是加减法,再进行乘或除 时,比如 1+2*3,这是会计算 2*3=6,将 6 存入。此时计算公式相当于 1+6 3) 程序中 backspaceClicked()用来实现退格功能.它会移除显示的数值的最 后一位.如果显示屏中为空字符串,按下退格键将会显示 0.waitingForOperand 被设置为 0. 退格功能实现代码如下: void Calculator::backspaceClicked() { if (waitingForOperand) return; QString text = display->text(); text.chop(1); if (text.isEmpty()) { text = "0"; waitingForOperand = true; } display->setText(text); } Clear()函数槽的功能相当于若干次 backspaceClicked()的功能,它会一次清除 显示屏中的数值.功能实现代码如下: void Calculator::clear() { if (waitingForOperand) return; display->setText("0"); waitingForOperand = true;
10

} clearAll()函数会实现计算器的初始化状态,代码如下: void Calculator::clearAll() { sumSoFar = 0.0; factorSoFar = 0.0; pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); display->setText("0"); waitingForOperand = true; } 4)界面中 sqrt 和 x^2 是通过直接对界面设置值的方式实现, 其代码如下所示 void Widget::sqrClicked() { double sqr = ui->display->text().toDouble(); ui->display->setText(QString::number(sqrt(sqr))); waitingForOperand = true; } void Widget::squareClicked() { double sqr = ui->display->text().toDouble(); ui->display->setText(QString::number(sqr*sqr)); waitingForOperand = true; }

11

3.3.3 记忆存储功能模块 功能实现代码如下: void Calculator::clearMemory() { sumInMemory = 0.0; } void Calculator::readMemory() { display->setText(QString::number(sumInMemory)); waitingForOperand = true; } void Calculator::setMemory() { equalClicked(); sumInMemory = display->text().toDouble(); } void Calculator::addToMemory() { equalClicked(); sumInMemory += display->text().toDouble(); } clearMemory()函数可以清除存储的数值,readMemory()函数为显示存储的数 值.setMemory()函数可以用当前显示的数值代替存储的数值,即设置数值功 能,addToMemory(0 函数可以把已经存储的数值加上当前显示的值并存储.

12

4

运行于结果分析

4.1 运行
在虚拟机中编译工程,生成可执行文件 cal,将其复制到虚拟机与 CP 机共 享目录中。打开串口终端,通过 rz 命令下载到开发板中。 具体步骤如下: 1)打开串口终端,如图所示:

图 6:串口终端

图 6:串口连接

图 8:设置串口

图 9:打开终端

在图 6 所示双击串口终端程序,弹出图 7 界面,点击快速连接,然后再 图 8 中设置串口连接。协议为 serial,串口连接。端口可在我的电脑中设备 管理器中查到,这里为开发板与 cp 机连接的端口号,我们设置为端口三。 数据位 8 位,无奇偶校验位,停止位为 1。设置完后点击连接,将会弹出图 9。等待系统初始化完,即可。 然后再命令行输入 cd /home,进入到 home 目录下载可执行程序 cal

13

2)下载程序:

图 9:rz 下载程序

如图 9 所示,输入 rz 命令后将会弹出文件选择栏。选择 pc 机与虚拟机 共享文件夹中的可执行文件 cal。点击确定即可下载文件。 3)加载 QT 运行所需要的库文件以及其他配置

图 10:配置运行环境

如图 10 所示, 在命令行中输入 source qtconf.sh。 运行这个脚本后, 系统会配置 qt 程序运行的各种环境 4)运行程序在命令行输入 ./cal。将会在开发板中运行计算器的程 序

4.2 结果分析
如图 11 中在板子上面按下 5 后在按 x^2,界面显示为图 12 所示 25。计算正 确 在图 13 中输入 1+2*3,结果为 7.计算正确 在图 14 中输入 1/0,结果显示为###,报错。

14

图 11

图 12

图 13

图 14

根据上述的运行结果可以得知本次设计的计算器功能可以实现,设计成功

15

参考文献
[1]马忠梅,ARM & Linux 嵌入式系统教程(第 3 版)[M] 。北京:北京航空航天 大学出版社,2014 [2]曹忠明,程姚根。从实践中学嵌入式 Linux 操作系统[M] 。北京:电子工业 出版社,2012 [3]宋宝华,Linux 设备驱动开发详解(第二版) [M ] 。北京:人民邮电出版社, 2010。 [4]韦东山,嵌入式 Linux 应用开发完全手册[M] 。北京:人民邮电出版社,2008 [5] 陆文周,Qt5 开发及实例[M] 。北京:电子工业出版社,2015 [6] Stephen Prata,C Primer Plus[M] 。北京:人民邮电出版社,2005

16





本次的课程设计结束了, 通过这次课程设计, 我在 Linux, Qt 方面收获很多, 之前我们做过 linux 以及 linux 下 Qt 编程的生产实习,本以为可以轻松完成, 但是实际上手自己操作,却发现没那么简单,从开始的设计到后来的实现,每一 步都必须十分认真、十分严谨。 在设计编写过程中,遇到了很多的困难,通过查资料、咨询老师、和同学商 量等方式逐个解决,过程很辛苦,但是让我感觉很充实。每一门语言、一个平台 的掌握都是一个循序渐进的过程,不是能够一蹴而就的,这也会让我以后扎扎实 实地学习、工作,避免一些不必要的错误。这次课程设计,充分利用了各种资源. 有从网上下载的 Qt 教程,也有视频教程.还有从图书馆借来的相应参考书与光盘. 以及研究生师兄师姐的帮忙.虽然是首次接触 Linux 系统下的开发以及 Qt.其所 独有的信号与槽机制也是第一次接触刚开始理解的确很吃力。 但这次设计总的来 说对我自己很有意义?因为是刚接触嵌入式编程对于这次设计自己把它视做一 次挑战?自己查阅资料自己解决问题这样的过程中给了自己很大的成就感与信 心。 当然这次课程设计也锻炼了自己分析实现方面的能力。在学习理论知识的同 时也能够自己动手去实现加深了自己对嵌入式的理解。 凭借和组员不懈的努力,总算初步掌握了 Qt 这一门新编程语言.最大的收获还是 熟悉了 Linux 下各种常用命令的使用.在这里我要感谢我的组员,他们一直帮助 我,督促我,使我克服了重重困难。更要感谢的是我们的指导老师罗泽老师,感 谢他的悉心照料与耐心指导。

17





附 录:程序清单
Widget.h: #ifndef WIDGET_H #define WIDGET_H

#include <QWidget> #include <QPushButton> #include <cmath> #include <QString> #include <QDebug>

namespace Ui { class Widget; }

class Widget : public QWidget { Q_OBJECT

public: explicit Widget(QWidget *parent = 0); ~Widget();

private: Ui::Widget *ui; double sumInMemory;

18

double sumSoFar; double factorSoFar; bool waitingForOperand; QString pendingAdditiveOperator; QString pendingMultiplicativeOperator;

public slots: void digitClicked(); void clearall(); void point(); void additiveOperatorClicked(); void multiplicativeOperatorClicked(); void abortOperation(); void equalClicked(); void sqrClicked(); void squareClicked(); void backspaceClicked(); bool calculate(double rightOperand, const QString &pendingOperator); };

#endif // WIDGET_H

Widget.cpp:
19

#include "widget.h" #include "ui_widget.h"

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) { this->move(190,60); ui->setupUi(this); sumInMemory = 0.0; sumSoFar = 0.0; factorSoFar = 0.0; waitingForOperand = true; pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); ui->display->setText("0");

connect(ui->bnt_0,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_1,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_2,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_3,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_4,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_5,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_6,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_7,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_8,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_9,SIGNAL(clicked()),this,SLOT(digitClicked())); connect(ui->bnt_c,SIGNAL(clicked()),this,SLOT(clearall())); connect(ui->bnt_op,SIGNAL(clicked()),this,SLOT(point())); connect(ui->bnt_ad,SIGNAL(clicked()),this,SLOT(additiveOperatorClicked())); connect(ui->bnt_su,SIGNAL(clicked()),this,SLOT(additiveOperatorClicked()));

20

connect(ui->bnt_mu,SIGNAL(clicked()),this,SLOT(multiplicativeOperatorClicked()) );

connect(ui->bnt_di,SIGNAL(clicked()),this,SLOT(multiplicativeOperatorClicked()) ); connect(ui->bnt_eq,SIGNAL(clicked()),this,SLOT(equalClicked())); connect(ui->bnt_sqr,SIGNAL(clicked()),this,SLOT(sqrClicked())); connect(ui->bnt_squ,SIGNAL(clicked()),this,SLOT(squareClicked())); connect(ui->bnt_back,SIGNAL(clicked()),this,SLOT(backspaceClicked())); }

Widget::~Widget() { delete ui; }

void Widget::digitClicked() { QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());

int digitValue = clickedButton->text().toInt(); if (ui->display->text() == "0"&& digitValue == 0.0) return; if (waitingForOperand) { ui->display->clear(); waitingForOperand = false; } ui->display->setText(ui->display->text() + QString::number(digitValue)); }

21

void Widget::clearall() { sumInMemory = 0.0; sumSoFar = 0.0; factorSoFar = 0.0; waitingForOperand = true; pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); ui->display->setText("0"); }

void Widget::point() { if (waitingForOperand) ui->display->setText("0"); if (!ui->display->text().contains(".")) ui->display->setText(ui->display->text() + tr(".")); waitingForOperand = false; }

void Widget::additiveOperatorClicked() { QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());

QString clickedOperator = clickedButton->text(); double operand = ui->display->text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation();
22

return; } ui-> display->setText(QString::number(factorSoFar)); operand = factorSoFar; factorSoFar = 0.0; pendingMultiplicativeOperator.clear(); }

if (!pendingAdditiveOperator.isEmpty()) { if (!calculate(operand, pendingAdditiveOperator)) { abortOperation(); return; } ui->display->setText(QString::number(sumSoFar)); } else { sumSoFar = operand; } pendingAdditiveOperator = clickedOperator; waitingForOperand = true; }

bool Widget::calculate(double rightOperand, const QString &pendingOperator) { if (pendingOperator == tr("+")) { sumSoFar += rightOperand; } else if (pendingOperator == tr("-")) {
23

sumSoFar -= rightOperand; } else if (pendingOperator == tr("*")) { factorSoFar *= rightOperand; } else if (pendingOperator == tr("/")) { if (rightOperand == 0.0) { pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); sumSoFar = 0; factorSoFar = 0; sumInMemory = 0; return false; } factorSoFar /= rightOperand; } return true; }

void Widget::multiplicativeOperatorClicked() { QPushButton *clickedButton = qobject_cast<QPushButton *>(sender()); QString clickedOperator = clickedButton->text(); double operand = ui->display->text().toDouble(); if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation();
24

return; } ui->display->setText(QString::number(factorSoFar)); } else { factorSoFar = operand; } pendingMultiplicativeOperator = clickedOperator; waitingForOperand = true; } void Widget::equalClicked() { double operand = ui->display->text().toDouble();

if (!pendingMultiplicativeOperator.isEmpty()) { if (!calculate(operand, pendingMultiplicativeOperator)) { abortOperation(); return; } operand = factorSoFar; factorSoFar = 0.0; pendingMultiplicativeOperator.clear(); } if (!pendingAdditiveOperator.isEmpty()) { if (!calculate(operand, pendingAdditiveOperator)) { abortOperation();
25

return; } pendingAdditiveOperator.clear(); } else { sumSoFar = operand; }

ui->display->setText(QString::number(sumSoFar)); sumSoFar = 0.0; waitingForOperand = true; }

void Widget::sqrClicked() { double sqr = ui->display->text().toDouble(); ui->display->setText(QString::number(sqrt(sqr))); waitingForOperand = true; }

void Widget::squareClicked() { double sqr = ui->display->text().toDouble(); ui->display->setText(QString::number(sqr*sqr)); waitingForOperand = true; }

void Widget::backspaceClicked() { if (waitingForOperand)
26

return;

QString text = ui->display->text(); text.chop(1); if (text.isEmpty()) { text = "0"; waitingForOperand = true; } ui->display->setText(text); }

void Widget::abortOperation() { clearall(); ui-> display->setText(tr("####")); }

Main.cpp: #include "widget.h" #include <QApplication> int main(int argc, char *argv[])
27

{ QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }

28


相关文章:
迷你计算器2.doc
《嵌入式系统》课程设计说明书 迷你计算器院 指导教师 课题名称 学生姓名 迷你计算器设计 一、目标 在 GEC210 开发板上使用 QT 设计一个迷你计算器。 二、任务...
项目2 迷你计算器_图文.ppt
项目2 迷你计算器 - 项目2 迷你计算器 ? 本项目学习目标 ? 掌握Visu
迷你计算器设计.doc
迷你计算器设计 - 单片机C语言课程设计迷你计算器设计... 二、任务 根据控制要求,明确设计任务,拟定设计方案与进度计划,运用所学的理论知识, 进行迷你计算器原理设计...
项目2--简易型计算器2.ppt
项目2--简易型计算器2 - 单片机应用技术 主讲:桂绍勇 项目二:简易型计算器
简易计算器 2.doc
简易计算器 2_计算机软件及应用_IT/计算机_专业资料。青海师范大学毕业论文
迷你计算器说明书.doc
迷你计算器说明书 - 摘 要 本设计要求学生设计、开发出一个简单的计算器。 通过
迷你计算器.doc
迷你计算器 - 1 *** 实践教学 *** 兰州理工大学 计算机与通信学院 2
计算器2_图文.doc
计算器2 - 课程设计报告 设计题目: 基于单片机的简易计算器 课程名称: 学生
迷你计算器说明书.doc
迷你计算器说明书 - 目摘前正 1. 2. 3. 4. 5. 6. 总 录 要
迷你计算器说明书_图文.doc
迷你计算器说明书 - 目摘 1. 2. 3. 4. 5. 6. 总 录 要 ..
计算器2.txt
计算器2 - 计算器 import java.awt.*; import jav
3种计算器的用法(2)_图文.ppt
3种计算器的用法(2) - fx-3600p计算器计算方差和标准差的方法: 计算器计算方差和标准差的方法: 计算器计算方差和标准差的方法 按mode 3 计算器可以进行方差...
计算器2.txt
计算器2 - using System; using System.Collec
用计算器计算2_图文.ppt
计算器计算2 - ? 按四舍五入 接近整十、整百、整千的数: 1、 4386
2.用计算器计算_图文.ppt
2.用计算器计算 - 2计算器计算 R 四年级上册 【学习目标】 1.初步学会使用计算器的方法,并能用计算器进行较 大数目的四则运算。 2.经历运用计算器...
迷你计算器设计.doc
迷你计算器设计 - *** 实践教学 *** 兰州理工大学 计算机与通信学院 2
计算器2.doc
计算器2 - 课题 主备人 计算器 使用人 课型 使用时间 新授 2014、9
计算器2_图文.ppt
计算器2 - 综合示例---功能较丰富的计算器 综合示例---功能较丰富的计算器
计算器2.txt
计算器2 - import java.awt.*; import java.aw
2.用计算器计算(2).doc
2.用计算器计算(2) - 用计算器计算(2) 任务温故知新 用计算器算一算,填
更多相关标签: