#include "calculatorapp.h"
#include "ui_calculatorapp.h"
CalculatorApp::CalculatorApp(QWidget *parent)
: QWidget(parent)
, ui(new Ui::CalculatorApp)
{
ui->setupUi(this);
bIsAppendDot = true;
bIsCalcError = false;
bIsDigitPres = false;
}
CalculatorApp::~CalculatorApp()
{
delete ui;
}
void CalculatorApp::printfExpress()
{
QString strValue = "";
ui->label_express->setText("");
for(int i=0; i<tagSegList.size() ;i++)
{
strValue += tagSegList.at(i).strExpress;
}
ui->label_express->setText(strValue);
}
void CalculatorApp::calculErrorEvent(bool isError)
{
bIsCalcError = isError;
ui->pushButton_rate->setEnabled(!isError);
ui->pushButton_fract->setEnabled(!isError);
ui->pushButton_square->setEnabled(!isError);
ui->pushButton_root->setEnabled(!isError);
ui->pushButton_div->setEnabled(!isError);
ui->pushButton_mul->setEnabled(!isError);
ui->pushButton_sub->setEnabled(!isError);
ui->pushButton_add->setEnabled(!isError);
ui->pushButton_point->setEnabled(!isError);
ui->pushButton_neg->setEnabled(!isError);
if(!isError) //init
{
tagSegList.clear();
ui->label_express->setText("");
ui->label_result->setText("0");
bIsAppendDot = true;
bIsDigitPres = false;
}
}
void CalculatorApp::on_pushButton_0_clicked() { digiButtonClick("0");}
void CalculatorApp::on_pushButton_1_clicked() { digiButtonClick("1");}
void CalculatorApp::on_pushButton_2_clicked() { digiButtonClick("2");}
void CalculatorApp::on_pushButton_3_clicked() { digiButtonClick("3");}
void CalculatorApp::on_pushButton_4_clicked() { digiButtonClick("4");}
void CalculatorApp::on_pushButton_5_clicked() { digiButtonClick("5");}
void CalculatorApp::on_pushButton_6_clicked() { digiButtonClick("6");}
void CalculatorApp::on_pushButton_7_clicked() { digiButtonClick("7");}
void CalculatorApp::on_pushButton_8_clicked() { digiButtonClick("8");}
void CalculatorApp::on_pushButton_9_clicked() { digiButtonClick("9");}
void CalculatorApp::on_pushButton_rate_clicked() {mathButtonClick(DEF_MATHRATE);}
void CalculatorApp::on_pushButton_fract_clicked() {mathButtonClick(DEF_MATHFRAC);}
void CalculatorApp::on_pushButton_square_clicked(){mathButtonClick(DEF_MATHSQR); }
void CalculatorApp::on_pushButton_root_clicked() {mathButtonClick(DEF_MATHROOT);}
void CalculatorApp::on_pushButton_add_clicked(){ signButtonClick("+");}
void CalculatorApp::on_pushButton_sub_clicked(){ signButtonClick("-");}
void CalculatorApp::on_pushButton_mul_clicked(){ signButtonClick("×");}
void CalculatorApp::on_pushButton_div_clicked(){ signButtonClick("/");}
void CalculatorApp::on_pushButton_equal_clicked()
{
if(bIsCalcError) { calculErrorEvent(false); return ; }
signButtonClick("=");
}
void CalculatorApp::on_pushButton_neg_clicked() {
double dbValue = ui->label_result->text().toDouble();
dbValue = 0 - dbValue;
ui->label_result->setText(formatDouble(dbValue));
if((0 < tagSegList.size()) && (ENUM_SEGNTYPE_VALUE == tagSegList.at(tagSegList.size()-1).eSegType))
{
TagSegInfo tagSegInfo;
tagSegInfo.eSegType = ENUM_SEGNTYPE_VALUE;
tagSegInfo.dbValue = dbValue;
tagSegInfo.strExpress ="negate("+tagSegList.at(tagSegList.size()-1).strExpress+")";
tagSegList.replace(tagSegList.size()-1,tagSegInfo);
printfExpress();
}
if((0 < tagSegList.size()) && (DEF_SIGNEQU == tagSegList.at(tagSegList.size()-1).strExpress))
{
tagSegList.clear();
printfExpress();
}
}
void CalculatorApp::on_pushButton_point_clicked(){
if(DEF_MAXCOUNT <= ui->label_result->text().count()) { return; }
bIsDigitPres = true;
if((tagSegList.size() > 0) && (DEF_SIGNEQU == tagSegList.at(tagSegList.size()-1).strExpress))
{
tagSegList.clear();
printfExpress();
}
if(!bIsAppendDot) { ui->label_result->setText("0."); }
else{ ui->label_result->setText(ui->label_result->text()+"."); }
}
void CalculatorApp::on_pushButton_CE_clicked()
{
if(bIsCalcError) { calculErrorEvent(false); }
if((tagSegList.size() > 0) && (DEF_SIGNEQU == tagSegList.at(tagSegList.size()-1).strExpress))
{
tagSegList.clear();
printfExpress();
}
bIsDigitPres = false;
ui->label_result->setText("0");
}
void CalculatorApp::on_pushButton_C_clicked()
{
if(bIsCalcError) { calculErrorEvent(false); }
tagSegList.clear();
ui->label_result->setText("0");
ui->label_express->setText("");
bIsAppendDot = true;
bIsCalcError = false;
bIsDigitPres = false;
}
void CalculatorApp::on_pushButton_back_clicked()
{
if(bIsCalcError) { calculErrorEvent(false); }
if((tagSegList.size() > 0) && (ENUM_SEGNTYPE_VALUE == tagSegList.at(tagSegList.size()-1).eSegType))
{ return;}
if((tagSegList.size() > 0) && (ENUM_SEGNTYPE_SIGN == tagSegList.at(tagSegList.size()-1).eSegType))
{
if(ENUM_SEGNTYPE_SIGN == tagSegList.at(tagSegList.size()-1).eSegType)
{
tagSegList.clear();
printfExpress();
bIsDigitPres = false;
return;
}
if(!bIsDigitPres) { return; }
}
if(1 < ui->label_result->text().count())
{ ui->label_result->setText(ui->label_result->text().mid(0,ui->label_result->text().count()-1));}
else{ ui->label_result->setText("0"); bIsDigitPres = false;}
}
///////////////////////////////////////////////////////////////////////////////////////
//Double value 小数点位数处理
QString CalculatorApp::formatDouble(double dbValue)
{
int ndecimal = DEF_MAXCOUNT -1-QString::number(dbValue,'f',0).count();
QString strResult = QString::number(dbValue,'f',ndecimal);
while('0' == strResult.at(strResult.count()-1))
{
strResult = strResult.mid(0,strResult.count()-1);
}
if('.' == strResult.at(strResult.count()-1))
{
strResult = strResult.mid(0,strResult.count()-1);
}
if(strResult.count() > (1+DEF_MAXCOUNT))
{
calculErrorEvent(true);
strResult = "溢出";
}
return strResult;
}
//数字按键
void CalculatorApp::digiButtonClick(QString digiVal)
{
if(DEF_MAXCOUNT < ui->label_result->text().count()) { return; }
if(bIsCalcError) { calculErrorEvent(false);}
bIsAppendDot = true;
if((0 < tagSegList.size()) && (ENUM_SEGNTYPE_VALUE == tagSegList.at(tagSegList.size()-1).eSegType))
{
tagSegList.removeLast();
printfExpress();
ui->label_result->setText(digiVal);
bIsDigitPres = true;
return;
}
if((0 < tagSegList.size()) && (ENUM_SEGNTYPE_SIGN == tagSegList.at(tagSegList.size()-1).eSegType) &&(!bIsDigitPres))
{
if(DEF_SIGNEQU == tagSegList.at(tagSegList.size()-1).strExpress) { tagSegList.clear(); printfExpress();}
ui->label_result->setText(digiVal);
bIsDigitPres = true;
return;
}
if((0 >= tagSegList.size()) && (!bIsDigitPres))
{
ui->label_result->setText(digiVal);
bIsDigitPres = true;
return;
}
if("0" == ui->label_result->text()) { ui->label_result->setText(digiVal); }
else { ui->label_result->setText(ui->label_result->text()+digiVal); }
bIsDigitPres = true;
}
//数学函数
void CalculatorApp::mathButtonClick(QString funType)
{
double dbValue = ui->label_result->text().toDouble();
//Error
if((DEF_MATHFRAC == funType) && (0 == dbValue)) {
calculErrorEvent(true);
ui->label_express->setText(ui->label_express->text()+"1/(0)");
ui->label_result->setText("除数不能�