提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本文是基于C++开发Qt计算器,实现功能有利用鼠标按下数字和运算符实现加减乘除基本运算(+-*/)、Clear清零按键功能实现和退格功能。本例还可以利用数字键盘对数字、加减乘除运算符和清除退格进行交互。但是在每次使用键盘前,建议先用鼠标点击一次=运算符,否则会出现无法计算的error。
在我看来计算器实现思路大概有两种。第一种较为复杂,我尝试了一天时间,最终还是放弃了,不过可以提供一个思路。(较为复杂,此处可以略,新手建议直接跳到第二种方法。也就是本文所做计算器的方法)
第一种方法:运行思路为,每次输入数字或运算符(简称op)时,都用QString类型字符串进行储存。(如果第一次输入是op,用if判断使其不进入QString存储)最终按下=,依次拆开数字和op进行存储,可能会使用到struct构造。再考虑到运算优先级对QString字符串拆分运算,输出结果。
第二种方法:如果第一次输入运算符时,对话框不显示。如果第一次输入数字时会将数字保存在浮点类型的num1中,再利用expression=QString("%1").arg (num1);语句,将浮点型num1转化并保存在QString类型的expression中,并在对话框显示。然后输入运算符,如果该数字是第一次输入,会先将num1放入浮点型的result中,并显示;如果该数字非第一次输入,则按下运算符会直接进行计算,然后显示。最终按下=符号即可得最终结果。
提示:以下是本篇文章正文内容,下面案例可供参考
一、pandas是什么?
设计界面如下:其中退格按键的图标打不出来,可以插入图片,用ps去掉白边,这样效果好点。
设置文本框字体和显示大小方式如下:
设置按键快捷键方式如下:
点开后直接点击键盘对应按键即可。
二、使用步骤
1.引入widget.h文件
代码如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QStack>
#include <QString>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_oneButton_clicked();
void on_twoButton_clicked();
void on_threeButton_clicked();
void on_fourButton_clicked();
void on_fiveButton_clicked();
void on_sixButton_clicked();
void on_sevenButton_clicked();
void on_eightButton_clicked();
void on_nineButton_clicked();
void on_ClearButton_clicked();
void on_backButton_clicked();
void on_zeroButton_clicked();
void on_equalButton_clicked();
void on_addButton_clicked();
void on_divisorButton_clicked();
void on_multipleButton_clicked();
void on_minusButton_clicked();
bool isOperatorRight(QString ch)const;
private:
Ui::Widget *ui;
QString expression;//创建Qt字符串,用于表示对话框的显示
QString testExpression;
float num1=false,num2=0,result=false;
float temResult=-1;
char sign='0';
int mark=1;
bool addFlag=true;
bool subFlag=true;
bool mulFlag=true;
bool divFlag=true;
};
#endif // WIDGET_H
2.引入widget.c文件
代码如下:
#include "widget.h"
#include "ui_widget.h"
#include "calculation.h"
#include <iostream>
using namespace std;
int num1,num2,num3,num4;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//固定控件框大小
this->setMaximumSize (199,342);
this->setMinimumSize (199,342);
//定义字体
// QFont font("微软雅黑",12);
//设置对话框显示字体
// ui->lineEdit->setFont (font);
//设置右边输入的对话框
// ui->lineEdit->setAlignment (Qt::AlignRight);
// ui->testLineEdit->setAlignment (Qt::AlignRight);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_oneButton_clicked()
{
num1=num1*10+1;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);
}
void Widget::on_twoButton_clicked()
{
num1=num1*10+2;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);
}
void Widget::on_threeButton_clicked()
{
num1=num1*10+3;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);
}
void Widget::on_fourButton_clicked()
{
num1=num1*10+4;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);
}
void Widget::on_fiveButton_clicked()
{
num1=num1*10+5;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);
}
void Widget::on_sixButton_clicked()
{
num1=num1*10+6;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);
}
void Widget::on_sevenButton_clicked()
{
num1=num1*10+7;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);
}
void Widget::on_eightButton_clicked()
{
num1=num1*10+8;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);;
}
void Widget::on_nineButton_clicked()
{
num1=num1*10+9;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);
qDebug()<<"num1:"<<num1<<";num2:"<<num2
<<";result:"<<result<<endl;
}
void Widget::on_zeroButton_clicked()
{
num1=num1*10;
expression=QString("%1").arg (num1);
ui->lineEdit->setText (expression);
}
void Widget::on_ClearButton_clicked()//"C"
{
expression.clear ();
ui->lineEdit->clear();
testExpression.clear();
ui->testLineEdit->clear ();
num1=0;
result=0;
sign='0';
addFlag=true;
subFlag=true;
mulFlag=true;
divFlag=true;
}
void Widget::on_backButton_clicked()//"<-"
{
qDebug()<<"now num1:"<<num1<<endl;//所有qDebug只是为了在终端测试
expression=QString("%1").arg(num1);
expression.chop(1);
num1=QString(expression).toFloat();
qDebug()<<"now num1:"<<num1<<endl;
ui->lineEdit->setText (expression);
}
void Widget::on_equalButton_clicked()//"="
{qDebug()<<"sign="<<sign;
switch(sign)
{
case'+':result+=num1;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
break;
case'-':result-=num1;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
break;
case'*':result*=num1;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
break;
case'/':result/=num1;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
break;
default:result=num1;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
break;
}
expression=QString("%1").arg(result);//float转QString
ui->lineEdit->setText (expression);
//初始化标志符号
qDebug()<<"Result:"<<result<<"Expression:"<<expression<<endl;
}
void Widget::on_addButton_clicked()//"+"
{
if(expression.size()>0)//如果第一个输入不是数字,则无法输入运算符
{
switch(sign)//计算前一个运算符
{
case'-':if(num1!=0)result-=num1;qDebug()<<"---"<<result<<endl;
break;
case'*':if(num1!=0)result*=num1;//每次使用*运算后,num1就会清0.防止result误清0
break;
case'/':if(num1!=0)result/=num1;
break;
default:
break;
}
if(addFlag)//第一次运算符号为-减号时才会使用
{
result=num1;
num1=0;
qDebug()<<"result==false"<<endl;
addFlag=false;
subFlag=false;
mulFlag=false;
divFlag=false;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
testExpression='+';
ui->lineEdit->setText (testExpression);
}
else
{
if(sign=='+')
result+=num1;
num1=0;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
testExpression='+';
ui->lineEdit->setText (testExpression);
}
}
sign='+';
}
void Widget::on_divisorButton_clicked()//"/"
{
if(expression.size()>0)
{
if(isOperatorRight(expression.at (expression.size ()-1)))
{
switch(sign)//继承上次符号继承
{
case'+':if(num1!=0)result+=num1;
break;
case'*':if(num1!=0)result*=num1;
break;
case'-':if(num1!=0)result-=num1;
break;
default:
break;
}
if(divFlag)
{
qDebug()<<"//1//"<<result<<endl;
result=num1;
num1=0;
addFlag=false;
subFlag=false;
mulFlag=false;
divFlag=false;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
testExpression='/';
ui->lineEdit->setText (testExpression);
}
else
{
qDebug()<<"//2//"<<result<<endl;
if(sign=='/')
result/=num1;
num1=0;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
testExpression='/';
ui->lineEdit->setText (testExpression);
}
}
}
sign='/';
}
void Widget::on_multipleButton_clicked()//"*"
{
if(expression.size()>0)
{
if(isOperatorRight(expression.at (expression.size ()-1)))
{
switch(sign)
{
case'+':if(num1!=0)result+=num1;
break;
case'-':if(num1!=0)result-=num1;
break;
case'/':if(num1!=0)result/=num1;
break;
default:
break;
}
if(mulFlag)
{
result=num1;
num1=0;qDebug()<<"**1**"<<result<<endl;
addFlag=false;
subFlag=false;
mulFlag=false;
divFlag=false;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
testExpression='*';
ui->lineEdit->setText (testExpression);
}
else
{qDebug()<<"**2**"<<result<<endl;
if(sign=='*')
result*=num1;
num1=0;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
testExpression='*';
ui->lineEdit->setText (testExpression);
}
}
}
sign='*';
}
void Widget::on_minusButton_clicked()//"-"
{
if(expression.size()>0)
{
if(isOperatorRight(expression.at (expression.size ()-1)))
{
switch(sign)//继承上次符号继承
{
case'+':if(num1!=0)result+=num1;qDebug()<<"+++"<<result<<endl;
break;
case'*':if(num1!=0)result*=num1;
break;
case'/':if(num1!=0)result/=num1;
break;
default:
break;
}
if(subFlag)//第一次运算符号为-减号时才会使用
{
result=num1;
num1=0;
addFlag=false;
subFlag=false;
mulFlag=false;
divFlag=false;
qDebug()<<"result==false"<<endl;
subFlag=false;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
testExpression='-';
ui->lineEdit->setText (testExpression);
}
else
{
if(sign=='-')
result-=num1;
num1=0;
expression=QString("%1").arg(result);
ui->testLineEdit->setText (expression);
testExpression='-';
ui->lineEdit->setText (testExpression);
}
}
}
sign='-';
}
bool Widget::isOperatorRight(QString ch)const//如果最后一个字符不是operator,返回真
{
bool flag=true;
if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
flag=false;
return flag;
}
总结
看着多,很多都是重复代码。