您的位置:首页 > 编程语言 > Qt开发

Qt简易计算器

2017-11-14 16:18 148 查看
以前用过java写计算器,但是渣渣的我没有成功,最近有时间重新写了一下计算器,思路比较简单,实现了简单的加减乘除、小数的运算和退格,还有正负号和CE的功能有待实现,在此做一个记录,日后慢慢完善。

calculator.h

#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QString>
class Calculator:public QDialog
{
Q_OBJECT
protected:
QLineEdit *lineEditor;
QPushButton *button_0;
QPushButton *button_1;
QPushButton *button_2;
QPushButton *button_3;
QPushButton *button_4;
QPushButton *button_5;
QPushButton *button_6;
QPushButton *button_7;
QPushButton *button_8;
QPushButton *button_9;
QPushButton *button_sign;
QPushButton *button_point;
QPushButton *button_c;
QPushButton *button_ce;
QPushButton *button_delete;
QPushButton *button_plus;
QPushButton *button_sub;
QPushButton *button_mul;
QPushButton *button_div;
QPushButton *button_equal;

int num1,num2,result;
QString S;

public:
Calculator();
private slots:
void button_0_clicked();
void button_1_clicked();
void button_2_clicked();
void button_3_clicked();
void button_4_clicked();
void button_5_clicked();
void button_6_clicked();
void button_7_clicked();
void button_8_clicked();
void button_9_clicked();
void button_plus_clicked();
void button_sub_clicked();
void button_mul_clicked();
void button_div_clicked();
void button_c_clicked();
void button_point_clicked();
void button_delete_clicked();
void button_equal_clicked();
};
#endif // CALCULATOR_H


calculator.cpp

#include "calculator.h"
#include <QPushButton>
#include <QDialog>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QStack>
#include <QDebug>
#include <stdlib.h>
#include <stdio.h>
int Exchange(const char *S1,char OPS[],int &len);
int calculate(char OPS[],int len,double &result);
Calculator::Calculator(){
setWindowTitle("Calculator");
num1=0;
num2=0;
result=0;
S="0";
lineEditor=new QLineEdit("0");
button_0=new QPushButton("0");
button_1=new QPushButton("1");
button_2=new QPushButton("2");
button_3=new QPushButton("3");
button_4=new QPushButton("4");
button_5=new QPushButton("5");
button_6=new QPushButton("6");
button_7=new QPushButton("7");
button_8=new QPushButton("8");
button_9=new QPushButton("9");
button_point=new QPushButton(".");
button_sign=new QPushButton("±");
button_c=new QPushButton("C");
button_ce=new QPushButton("CE");
button_delete=new QPushButton("DE");
button_div=new QPushButton("÷");
button_mul=new QPushButton("×");
button_sub=new QPushButton("-");
button_plus=new QPushButton("+");
button_equal=new QPushButton("=");

QHBoxLayout *H1=new QHBoxLayout;
QHBoxLayout *H2=new QHBoxLayout;
QHBoxLayout *H3=new QHBoxLayout;
QHBoxLayout *H4=new QHBoxLayout;
QHBoxLayout *H5=new QHBoxLayout;
QHBoxLayout *H6=new QHBoxLayout;
H1->addWidget(button_ce);
H1->addWidget(button_c);
H1->addWidget(button_delete);
H1->addWidget(button_div);
H2->addWidget(button_7);
H2->addWidget(button_8);
H2->addWidget(button_9);
H2->addWidget(button_mul);
H3->addWidget(button_4);
H3->addWidget(button_5);
H3->addWidget(button_6);
H3->addWidget(button_sub);
H4->addWidget(button_1);
H4->addWidget(button_2);
H4->addWidget(button_3);
H4->addWidget(button_plus);
H5->addWidget(button_sign);
H5->addWidget(button_0);
H5->addWidget(button_point);
H5->addWidget(button_equal);
H6->addWidget(lineEditor);
QVBoxLayout *V=new QVBoxLayout;
V->addLayout(H6);
V->addLayout(H1);
V->addLayout(H2);
V->addLayout(H3);
V->addLayout(H4);
V->addLayout(H5);
setLayout(V);
connect(button_0,SIGNAL(clicked(bool)),this,SLOT(button_0_clicked()));
connect(button_1,SIGNAL(clicked(bool)),this,SLOT(button_1_clicked()));
connect(button_2,SIGNAL(clicked(bool)),this,SLOT(button_2_clicked()));
connect(button_3,SIGNAL(clicked(bool)),this,SLOT(button_3_clicked()));
connect(button_4,SIGNAL(clicked(bool)),this,SLOT(button_4_clicked()));
connect(button_5,SIGNAL(clicked(bool)),this,SLOT(button_5_clicked()));
connect(button_6,SIGNAL(clicked(bool)),this,SLOT(button_6_clicked()));
connect(button_7,SIGNAL(clicked(bool)),this,SLOT(button_7_clicked()));
connect(button_8,SIGNAL(clicked(bool)),this,SLOT(button_8_clicked()));
connect(button_9,SIGNAL(clicked(bool)),this,SLOT(button_9_clicked()));
connect(button_plus,SIGNAL(clicked(bool)),this,SLOT(button_plus_clicked()));
connect(button_sub,SIGNAL(clicked(bool)),this,SLOT(button_sub_clicked()));
connect(button_mul,SIGNAL(clicked(bool)),this,SLOT(button_mul_clicked()));
connect(button_div,SIGNAL(clicked(bool)),this,SLOT(button_div_clicked()));
connect(button_equal,SIGNAL(clicked(bool)),this,SLOT(button_equal_clicked()));
connect(button_c,SIGNAL(clicked(bool)),this,SLOT(button_c_clicked()));
connect(button_point,SIGNAL(clicked(bool)),this,SLOT(button_point_clicked()));
connect(button_delete,SIGNAL(clicked(bool)),this,SLOT(button_delete_clicked()));
}

void Calculator::button_0_clicked()
{
if(S=="0"){
S="0";
}
else{
S+="0";
}
lineEditor->setText(S);
}
void Calculator::button_1_clicked()
{
if(S=="0"){
S="1";
}
else{
S+="1";
}
lineEditor->setText(S);
}
void Calculator::button_2_clicked()
{
if(S=="0"){
S="2";
}
else{
S+="2";
}
lineEditor->setText(S);
}
void Calculator::button_3_clicked()
{
if(S=="0"){
S="3";
}
else{
S+="3";
}
lineEditor->setText(S);
}
void Calculator::button_4_clicked()
{
if(S=="0"){
S="4";
}
else{
S+="4";
}
lineEditor->setText(S);
}
void Calculator::button_5_clicked()
{
if(S=="0"){
S="5";
}
else{
S+="5";
}
lineEditor->setText(S);
}
void Calculator::button_6_clicked()
{
if(S=="0"){
S="6";
}
else{
S+="6";
}
lineEditor->setText(S);
}
void Calculator::button_7_clicked()
{
if(S=="0"){
S="7";
}
else{
S+="7";
}
lineEditor->setText(S);
}
void Calculator::button_8_clicked()
{
if(S=="0"){
S="8";
}
else{
S+="8";
}
lineEditor->setText(S);
}
void Calculator::button_9_clicked()
{
if(S=="0"){
S="9";
}
else{
S+="9";
}
lineEditor->setText(S);
}
void Calculator::button_plus_clicked()
{
if(S=="0"){
S="+";
}
else{
S+="+";
}
lineEditor->setText(S);
}
void Calculator::button_sub_clicked()
{
if(S=="0"){
S="-";
}
else{
S+="-";
}
lineEditor->setText(S);
}
void Calculator::button_mul_clicked()
{
if(S=="0"){
S="*";
}
else{
S+="*";
}
lineEditor->setText(S);
}
void Calculator::button_div_clicked()
{
if(S=="0"){
S="/";
}
else{
S+="/";
}
lineEditor->setText(S);
}
void Calculator::button_c_clicked()
{
if(S=="0"){
S="0";
}
else{
S="0";
}
lineEditor->setText(S);
}
void Calculator::button_point_clicked()
{
if(S=="0"){
S=".";
}
else{
S+=".";
}
lineEditor->setText(S);
}
void Calculator::button_delete_clicked()
{
if(S=="0")
S="0";
else
{
S=S.left(S.length()-1);
}
lineEditor->setText(S);
}
void Calculator::button_equal_clicked()
{
std::string str=S.toStdString();
const char *S1=str.c_str();
char OPS[50];
int len;
double result;
QString change;
Exchange(S1,OPS,len);
calculate(OPS,len,result);
change=QString::number(result,10,2);
S=S+"="+change;
lineEditor->setText(str);
}
int Exchange(const char *S1, char OPS[], int &len)
{
QStack<char>OPE;
int i,j=0;
int length=strlen(S1);
for(i=0;i<length;i++){
switch (S1[i]) {
case '+':
if(OPE.isEmpty())
OPE.push(S1[i]);
else if(OPE.top()=='*'||OPE.top()=='/'||OPE.top()=='-')
{
OPS[j++]=OPE.pop();
i--;
}
else
OPE.push(S1[i]);
break;
case '-':
if(OPE.isEmpty())
OPE.push(S1[i]);
else if(OPE.top()=='*'||OPE.top()=='/'||OPE.top()=='+')
{
OPS[j++]=OPE.pop();
i--;
}
else
OPE.push(S1[i]);
break;
case '*':
if(OPE.isEmpty())
OPE.push(S1[i]);
else if(OPE.top()=='/')
{
OPS[j++]=OPE.pop();
i--;
}
else
OPE.push(S1[i]);
break;
case '/':
if(OPE.isEmpty())
OPE.push(S1[i]);
else if(OPE.top()=='*')
{
OPS[j++]=OPE.pop();
i--;
}
else
OPE.push(S1[i]);
break;
default:
while((S1[i]>='0'&&S1[i]<='9')||S1[i]=='.')
{
OPS[j++]=S1[i];
i++;
}
i--;
OPS[j++]='#';
break;
}
}
while(!OPE.isEmpty())
{
OPS[j++]=OPE.pop();
}
len=j;
return 0;
}
int calculate(char OPS[],int len,double &result)
{
int i;
double a;
double b;
double c;
QStack<double>SZ;
for(i=0;i<len;i++){
switch (OPS[i]) {
case '+':
{
a=SZ.pop();
b=SZ.pop();
c=b+a;
SZ.push(c);
break;
}
case '-':
{
a=SZ.pop();
b=SZ.pop();
c=b-a;
SZ.push(c);
break;
}
case '*':
{
a=SZ.pop();
b=SZ.pop();
c=b*a;
SZ.push(c);
break;
}
case '/':
{
a=SZ.pop();
b=SZ.pop();
if(a==0){
return 0;
}
c=b/a;
SZ.push(c);
break;
}
default:
int j=0;
double d;
char *st=new char[10];
while(OPS[i]!='#'){
st[j++]=OPS[i];
i++;
}
d=atof(st);
SZ.push(d);
delete st;
break;
}
}
result=SZ.top();
return 0;
}


main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QLabel>
#include <QMouseEvent>
#include "custombutton.h"
#include "calculator.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Calculator cal;
cal.show();
return a.exec();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息