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