计算机软件实习项目一 简单计算器 (Qt实现计算器界面) 12-5
UI用户界面
使用Qt Designer对计算器的界面进行制作
目录
- UI用户界面
- 界面设计
- 功能描述
- 界面浏览
- 新功能
- 1.小数点前后自动补0
- 2.加减乘除自动切换
- 3.不允许的操作按了不会生效
- 4.历史记录循环查看
- dbug
- 1.除0
- 2.负数运算
- 3.一个数只能有一个小数点
- 4.无记录时查看记录出错
- 按钮样式
- 效果
- LineEdit样式
- 效果
- 代码实现
- 枚举变量
- QtGuiApplication类的声明
- QtGuiApplication类的定义
- 槽函数的定义
界面设计
界面由22个按钮和1个线型编辑器组成,去除了菜单栏和状态栏。仿照苹果计算器,整体配色为黑、灰、橙;背景为黑色,数字、字母或符号为白色;更改了软件的名字以及软件的图标。
功能描述
C:清楚当前表达式和计算结果的历史记录
H:循环查看计算结果的历史记录
←:退格
CE:清除当前表达式
其他运算符和操作数:输入对应的字符
界面浏览
新功能
1.小数点前后自动补0
输入 “2.” 按下 ‘+’ 号会自动补0变成 “2.0+”,再输入 “.3” 会自动补0变成0.3
2.加减乘除自动切换
输入 “2*” 后输入 ‘/’ 或 ‘+’ 会自动变换当前符号。
3.不允许的操作按了不会生效
一个数字有小数点了就不能再按小数点,这时也按小数点也不会生效
括号里不为空
4.历史记录循环查看
计算若干表达式后按 ‘H’ 键,查看计算历史记录,第一次案会返回最近一次的计算结果,再按一次返回上上次的计算结果,以此类推;当到达最后一条也就是最早的计算记录的时候再按下 ‘H’ 键,则会返回最近一次的计算记录,也就是说这个记录是可以循环查询的。并且每当有一个新的结果产生时,再一次按下 ‘H’ 键还会返回最近一次的计算记录。
dbug
1.除0
通过修改程序使得原本除0会崩溃的程序变成了输出inf
2.负数运算
把负号和减号区分开,这里-4当成一个整体,计算结果正确
3.一个数只能有一个小数点
原代码一个数可以有多个小数点如2.33.44,修改代码后一个数不可输入多个小数点
4.无记录时查看记录出错
无记录时按下 ‘H’ 键会报错,修改后不做任何操作程序正常运行
按钮样式
通过Qt Designer编辑按钮的样式表,设置按钮的背景颜色以及包边,鼠标悬停在按钮上的颜色以及按下按钮的颜色。
QPushButton{background-color: rgb(180, 180, 180);border:1px solid gray;
}
QPushButton:hover{background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgb(230, 230, 230), stop:1 rgb(180, 180, 180));
}
QPushButton:pressed{background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgb(180, 180, 180), stop:1 rgb(230, 230, 230));
}
效果
除号 ‘/’ 为未选中效果,乘号’×’ 为按下效果
LineEdit样式
通过Qt Designer编辑按钮的样式表,设置线性编辑框的背景颜色为黑色,和主窗口相同;设置无边框;设置文字颜色为白色;设置文本为纵向居中对齐,横向右对齐。
效果
代码实现
枚举变量
定义枚举变量,区分不同的按钮
//枚举按键类型
enum BtnType
{Num, //数字类型Op, //运算符Dot, //点Equal, //等于Back, //退格Clear, //清除Empty, //清空History,//历史记录Bracket //括号
};
QtGuiApplication类的声明
class QtGuiApplication : public QMainWindow
{//支持信号和槽Q_OBJECTpublic://构造函数QtGuiApplication(QWidget *parent = Q_NULLPTR);private:Ui::QtGuiApplicationClass ui;//当前串QString str;//当前数字QString cnum;//历史记录QStringList list;//记录按了几下historyint k;// 声明槽函数
public slots:void OnClicked(BtnType _type, QString _btn);};
QtGuiApplication类的定义
构造函数里对窗口名字、图标进行修改,对成员变量进行初始化,对按钮进行绑定
QtGuiApplication::QtGuiApplication(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);setWindowTitle("LuoHan Calculator v1.0");setWindowIcon(QIcon("A3.png"));//初始化成员变量this->str = "";//记录按了几下historythis->k = 0;//数字按钮绑定connect(ui.pushButton_00, &QPushButton::clicked, [this]() {OnClicked(Num, "0"); });connect(ui.pushButton_01, &QPushButton::clicked, [this]() {OnClicked(Num, "1"); });connect(ui.pushButton_02, &QPushButton::clicked, [this]() {OnClicked(Num, "2"); });connect(ui.pushButton_03, &QPushButton::clicked, [this]() {OnClicked(Num, "3"); });connect(ui.pushButton_04, &QPushButton::clicked, [this]() {OnClicked(Num, "4"); });connect(ui.pushButton_05, &QPushButton::clicked, [this]() {OnClicked(Num, "5"); });connect(ui.pushButton_06, &QPushButton::clicked, [this]() {OnClicked(Num, "6"); });connect(ui.pushButton_07, &QPushButton::clicked, [this]() {OnClicked(Num, "7"); });connect(ui.pushButton_08, &QPushButton::clicked, [this]() {OnClicked(Num, "8"); });connect(ui.pushButton_09, &QPushButton::clicked, [this]() {OnClicked(Num, "9"); });//运算符按钮绑定connect(ui.pushButton_plus, &QPushButton::clicked, [this]() {OnClicked(Op, "+"); });connect(ui.pushButton_minus, &QPushButton::clicked, [this]() {OnClicked(Op, "-"); });connect(ui.pushButton_multiply, &QPushButton::clicked, [this]() {OnClicked(Op, "*"); });connect(ui.pushButton_divide, &QPushButton::clicked, [this]() {OnClicked(Op, "/"); });connect(ui.pushButton_leftbracket, &QPushButton::clicked, [this]() {OnClicked(Bracket, "("); });connect(ui.pushButton_rightbracket, &QPushButton::clicked, [this]() {OnClicked(Bracket, ")"); });//其他按钮connect(ui.pushButton_BACKSPACE, &QPushButton::clicked, [this]() {OnClicked(Back, "Back"); });connect(ui.pushButton_CE, &QPushButton::clicked, [this]() {OnClicked(Clear, "Clear"); });connect(ui.pushButton_Dot, &QPushButton::clicked, [this]() {OnClicked(Dot, "."); });connect(ui.pushButton_equal, &QPushButton::clicked, [this]() {OnClicked(Equal, "="); });connect(ui.pushButton_C, &QPushButton::clicked, [this]() {OnClicked(Empty, "Empty"); });connect(ui.pushButton_History, &QPushButton::clicked, [this]() {OnClicked(History, "History"); });
}
槽函数的定义
因为功能较单一,我只定义了一个槽函数对所有按钮进行操作
void QtGuiApplication::OnClicked(BtnType _type, QString _btn);
每按下一个按钮就初始化如下变量:
Calculate()对象用于计算表达式
result用于存放二元运算的结果
temp指向当前表达式的最后一个字符
history为当前历史记录
flag1表示:有无多个小数点
flag2表示:小数点前有无数字
Calculate calculator = Calculate();string result = "";QString temp = str.right(1);QString history = "";//一个数有无多个小数点;int flag1 = 0;//小数点前有无数字;int flag2 = 0;
接下来就是判断按钮的类型用一个switch语句即可
switch (_type)
如果当前按钮是 数字:
① 如果有小数点且小数点前无数字就在小数点前补0
② 否则直接加上这个数字
case Num://如果数字前面是小数点且小数点前面没有数字就补0if (temp == ".") {for (int i = str.length() - 1; i >= 0; i--) {if (str.at(i) == "+" || str.at(i) == "-" || str.at(i) == "*" || str.at(i) == "/" || str.at(i) == "(" || str.at(i) == ")") {break;}if (str.at(i) == "0"|| str.at(i) == "1" || str.at(i) == "2" || str.at(i) == "3" || str.at(i) == "4" || str.at(i) == "5" || str.at(i) == "6" || str.at(i) == "7" || str.at(i) == "8" || str.at(i) == "9") {flag2 = 1;break;}}}if (temp=="." && flag2 == 0) {//补0str = str.insert(str.length() - 1, "0");str += _btn;break;}str += _btn;break;
如果当前按钮是 运算符:
① 如果是小数点就补0
② +、-、*、/ 可替换
case Op://如果前面是小数点补0if (temp == ".") {str += "0";}//运算符规则if (temp.compare("+") == 0 || temp.compare("-") == 0) {if (_btn.compare("-") == 0 || _btn.compare("+") == 0 || _btn.compare("*") == 0 || _btn.compare("/") == 0 ) {str = str.replace(str.length() - 1, 1, _btn);break;}}if ((temp.compare("*") == 0 || temp.compare("/") == 0)) {if (_btn.compare("*") == 0 || _btn.compare("/") == 0 || _btn.compare("+") == 0) {str = str.replace(str.length() - 1, 1, _btn);break;}if (_btn.compare("-") == 0) {str += _btn;break;}}str += _btn;break;
如果当前按钮是 ‘(’ 或 ‘)’:
① 如果括号里没东西什么也不做
② 否则加上括号
case Bracket:if (temp.compare("(")==0 && _btn.compare(")") == 0) {break;}str += _btn;break;
如果当前按钮是 ‘.’:
① 如果前面有括号什么也不做
② 如果前面有小数点也什么都不做
case Dot:if (temp.compare("(") == 0||temp.compare(")") == 0) {break;}for (int i = str.length() - 1; i >= 0;i--) {if (str.at(i) == "+"|| str.at(i) == "-" || str.at(i) == "*" || str.at(i) == "/" || str.at(i) == "(" || str.at(i) == ")") {break;}if (str.at(i) == ".") {flag1 = 1;break;}}if (flag1 == 1)break;str += _btn;break;
如果当前按钮是 ‘=’:
① 如果表达式为空什么也不做
② 如果最后是小数点补0
③ 把计算结果加入到表达式末尾并且存入结果记录并把表达式清空,更新最新历史记录
case Equal://如果表达式为空不做操作if (str.length() == 0) {k = 0;return;}//如果最后是小数点补0if (str.right(1) == ".")str += "0";//string 和 QString的转换,把结果加在等号后面temp = str;result = calculator.calculate_expression(str.toStdString());str = QString::fromStdString(result);list.append(temp+ QString::fromStdString(" = ") +str);ui.lineEdit->setText(str);str = "";k = 0;return;
如果当前按钮是 ’ ←’:
① 删除表达式末尾的一个字符
case Back:str.chop(1);break;
如果当前按钮是 ‘CE’:
① 清空表达式
case Clear:str = "";break;
如果当前按钮是 ‘C’:
① 清空表达式及历史记录
case Empty:str = "";list.clear();break;
如果当前按钮是 ‘H’:
① 循环查看历史记录
case History:if (list.length() == 0)return;if (list.length() - 1 - k == -1)k=0;history = list.at(list.length()-1-k);ui.lineEdit->setText(history);k += 1;return;
最后记得更新编辑框结果
//更新结果ui.lineEdit->setText(str);
计算机软件实习项目一 简单计算器 (Qt实现计算器界面) 12-5相关推荐
- 计算机软件技术实习 项目一 简单计算器的实现(实验准备)1-(1)
目录 一.需求分析 二.重难点 三.编程语言 四.开发工具/平台 一.需求分析 1. 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示: 2.保存和浏览历史运算记录: ...
- 超详细且简单的Qt Designer设置界面背景图
---------------------------------------------------------- 这里介绍的主要是一种放置界面底层的背景图方式 首先,先新建一个框,并填充你所需要的 ...
- linux下实现QT计算器,Qt实现计算器
<Qt实现计算器>由会员分享,可在线阅读,更多相关<Qt实现计算器(10页珍藏版)>请在人人文库网上搜索. 1.Qt设计报告-计算器实现学 院: xxxxxxxxxxxxxxx ...
- 计算机软件实习——项目一
项目一需要我们做出一个基础的计算器,要包含加减乘除.验算式子等功能,均由Java编写. 首先考虑UI制作,Java自带的Java GUI即Java的图形用户界面,包含了AWT,Swing,javaFX ...
- 计算机软件实习项目三 —— 超级玛丽闯迷宫 (代码实现) 12-21
代码实现(超级玛丽闯迷宫) 上一篇博客对这个游戏的整体框架以及算法的流程进行了比较详细的设计及分析:对必要的类和类的成员变量.类的方法进行了声明以及声明.这一篇博客主要来呈现相关代码. 目录 代码 ...
- 计算机软件实习项目二 —— 贪吃蛇游戏 (代码实现) 12-16
代码实现 不得不说python真是太香了,我感觉写起来比C++快,而且代码量更少,还有非常多十分方便的方法可以使用.在pycharm里有非常多的快捷键十分的方便,相较项目使用的visual stu ...
- 计算机软件实习项目三 —— 超级玛丽闯迷宫(游戏介绍 游戏视屏 游戏下载)12-21
超级玛丽闯迷宫(游戏介绍 & 游戏视屏 & 游戏下载) 经过了几天的开发,超级玛丽床迷宫游戏总算是出炉了.这次开发比前两个项目快了许多,迷宫的定义及随机生成花费一天完成,迷宫自动寻 ...
- 计算机软件实习项目三 —— 超级玛丽闯迷宫 (实验准备) 12-19(12-21更新)
实验准备(超级玛丽闯迷宫) 经过了前面两个项目的实践,我对python和pyqt5已经有了一定的了解,除了能够把实验要求全部完成,还加入了自己的一些想法在游戏里,让游戏更加有趣. 第三个项目主 ...
- 计算机软件实习项目二 —— 贪吃蛇游戏 (实验准备)
目录 一.实验目的 二.编程语言和平台 三.实验难点: 四.参考资料 一.实验目的 1.实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子 2.上下左右控制"蛇 ...
最新文章
- Hello,Word宏!
- Nginx 配置https 自动续期
- 关于Java中的线程安全(线程同步)
- 测试软件ipc,IPC整机测试工具
- 谈谈我对服务熔断、服务降级的理解
- java按比例之原图生成缩略图
- pytorch 创建神经网络
- 更新条目时出错。有关详细信息,请参见内部异常。
- 并发减库存,怎么保证不超卖?
- Oracle数据库编译存储过程挂死问题解决办法
- 未来的人工智能和 AR/VR 会从哪些方面影响教育?有什么机会?
- android 源码编译apk,在Android源码里编译apk
- FAT32 文件系统详解
- 天神娱乐实控人朱晔宣布离职:暂时的离开是为更好相见
- WCF服务系列——定义宿主(IIS服务宿主)
- python 检验两个样本均值是否相同_假设检验|第四章:置信区间和置信水平
- 我的世界神级种子Java_单机生存必备 我的世界神级种子推荐
- 猎魂觉醒服务器界面不显示角色,猎魂觉醒新人常见问题集合 新人常见问题解决_3DM手游...
- Intel_IPP 的基本使用方法
- 图灵 数理逻辑 人工智能 图灵机与计算问题 论文
热门文章
- Congestion Attacks in Payment Channel Networks(支付渠道网络中的拥塞攻击)阅读笔记
- Java开发工程师(Web方向)微专业大作业的实现(含源码资源)
- 广州市积分制入户10月8日起接受申请
- CodeForces 732A-Buy a Shovel
- 转 C语言改变字体颜色,如何在c语言中改变背景和字体的颜色?
- 2017年校园招聘ios面试题
- 开源软件与数字图书馆
- SCSI、iSCSI、FC
- 仿哔哩哔哩应用客户端Android版源码
- lenovo联想笔记本电脑拯救者Y9000P IAH7H 2022款(82RF)i7-12700H原装出厂Win11系统恢复原厂OEM系统