高效学 C++|编程实例之计算器

【高效学 C++|编程实例之计算器】本节将实现一个能进行实数间加、减、乘、除运算的简易计算器 。首先创建一个基于带界面的Qt项目,然后按照如下步骤进行操作:
01、计算器界面设计
在界面中拖入两个单行文本框和十七个按钮,按钮上显示的文字、按钮对象和单行文本框对象名如图1所示 。为了美观起见,设置窗口为“栅格布局”以对齐部件 。
将窗口对象的“”属性设置为“计算器”;勾选掉第一个单行文本框(对象)的“”属性,使得该单行文本框变为灰色(该文本框仅用于显示结果);勾选上第二个单行文本框(对象)的“”属性(限制用户不能直接在文本框中通过键盘输入内容)、将其的“”水平属性设置为“” 。
■图1计算器界面设计
02、计算器功能实现
进行算术运算时,之前输入的左操作数和操作符需存储(右操作数可直接从文本框中读取),因此在自定义窗口类中添加私有数据成员如下:
QString operandStr1; //用于存储字符串形式的左操作数QString operatorStr; //用于存储操作符
并在类的构造函数体中添加如下语句以将它们初始化为空串:
operandStr1="";operatorStr="";
接下来实现点击各个按钮时触发的功能:给每个按钮的()信号都添加自关联槽 。以按钮1为例,自关联槽实现代码如下:
void Widget::on_btn_1_clicked(){ui->lineEdit_Input->setText(ui->lineEdit_Input->text()+"1");}
按钮2到9的功能实现和按钮1是类似的,只需把上述代码中的字符"1"改成对应的数字字符即可 。对于按钮0,由于一般不会出现诸如“00”形式的数字“0”,因此代码中对这种情况进行了处理,自关联槽定义如下:
void Widget::on_btn_0_clicked(){if(ui->lineEdit_Input->text()!="0")ui->lineEdit_Input->setText(ui->lineEdit_Input->text()+"0");}
小数点按钮需要考虑按下时前面没有数字的情形(此时默认为整数部分为0)、按下时串中已有了小数点的情形,最终自关联槽定义如下:
void Widget::on_btn_Point_clicked(){if(ui->lineEdit_Input->text()=="")ui->lineEdit_Input->setText("0.");else if(ui->lineEdit_Input->text().contains(".")==true); //数字串中已有小数点,不能再输入elseui->lineEdit_Input->setText(ui->lineEdit_Input->text()+".");}
clear按钮点击时,只需将文本框中的内容清空即可,代码如下:
void Widget::on_btn_clear_clicked(){ui->lineEdit_Input->clear();}
加、减、乘、除按钮的实现是类似的 。以加法按钮为例:分情况进行处理,如果按下时文本框中是空串则不进行任何处理直接结束;否则说明用户提供了一个操作数,接下来判断它是左操作数还是右操作数;若为空说明文本框中是左操作数,将其存储到、将运算符“+”存储到、将文本框清空以待用户再次输入右操作数、将已输入的内容显示于文本框中;若不为空说明文本框中已是右操作数,此时按下加号和按下等号作用是相同的,直接调用点击等号按钮关联的槽函数进行处理即可 。实现代码如下:
void Widget::on_btn_Add_clicked(){if(ui->lineEdit_Input->text()=="") //没有输入数据return;else if(operandStr1=="") //没有左操作数{operandStr1=ui->lineEdit_Input->text();operatorStr="+";ui->lineEdit_Input->clear();//输入文本框清空,以待输右操作数ui->lineEdit_Show->setText(operandStr1+operatorStr);}elseon_btn_Calc_clicked();}
其它三个运算符的实现是一样的,只需将上述代码中赋值给的字符串改成相应的运算符即可 。
最后是等号按钮的实现,代码如下:
void Widget::on_btn_Calc_clicked(){if(operandStr1!=""&&ui->lineEdit_Input->text()!=""&&operatorStr!=""){double result;double operand1=operandStr1.toDouble();double operand2=ui->lineEdit_Input->text().toDouble();if(operatorStr=="+")result=operand1+operand2;else if(operatorStr=="-")result=operand1-operand2;else if(operatorStr=="*")result=operand1*operand2;else if(operatorStr=="/")if(operand2!=0.0)result=operand1/operand2;else{QMessageBox::warning(this,"提示","除数不能为零");result=0;}ui->lineEdit_Show->setText(QString::number(result));operandStr1=""; //计算完毕,操作数清空operatorStr=""; //计算完毕,操作符清空ui->lineEdit_Input->clear(); //计算完毕,数据输入文本框清空}}