170 lines
3.8 KiB
C++
170 lines
3.8 KiB
C++
#include "mainwindow.h"
|
|
#include "ui_mainwindow.h"
|
|
#include <QMessageBox>
|
|
|
|
static std::string displayTest;
|
|
|
|
MainWindow::MainWindow(QWidget *parent)
|
|
: QMainWindow(parent)
|
|
, ui(new Ui::MainWindow)
|
|
{
|
|
ui->setupUi(this);
|
|
ui->lineEdit->setText("0");
|
|
result=0.0;
|
|
waitForOperand=true;
|
|
|
|
connectSlots();
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
//计算
|
|
bool MainWindow::calculate(double operand, QString pendingOperator)
|
|
{
|
|
if(pendingOperator == "+")
|
|
{
|
|
result += operand;
|
|
}
|
|
else if(pendingOperator == "-")
|
|
{
|
|
result -= operand;
|
|
}
|
|
else if(pendingOperator == "*")
|
|
{
|
|
result *= operand;
|
|
}
|
|
else if(pendingOperator == "/")
|
|
{
|
|
if(operand == 0.0)
|
|
return false;
|
|
result /= operand;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//错误处理
|
|
void MainWindow::abortOperation()
|
|
{
|
|
result = 0.0;
|
|
pendingOperator.clear();
|
|
ui->lineEdit->setText("0");
|
|
waitForOperand = true;
|
|
QMessageBox::warning(this, "运算错误", "除数不能为零");
|
|
}
|
|
|
|
//似乎是数字被点击
|
|
void MainWindow::digitClicked()
|
|
{
|
|
QPushButton *digitBtn = static_cast<QPushButton*>(sender());
|
|
QString value = digitBtn->text();
|
|
// if(ui->lineEdit->text() == "0" && value == "0")
|
|
// return;
|
|
if(waitForOperand)
|
|
{
|
|
ui->lineEdit->setText(value);
|
|
waitForOperand = false;
|
|
}
|
|
else
|
|
{
|
|
ui->lineEdit->setText(ui->lineEdit->text() + value);
|
|
}
|
|
}
|
|
|
|
void MainWindow::on_clearBtn_clicked()
|
|
{
|
|
//将当前显示的数归零
|
|
ui->lineEdit->setText("0");
|
|
waitForOperand = true;
|
|
}
|
|
|
|
void MainWindow::on_clearAllBtn_clicked()
|
|
{
|
|
//将当前显示的数据归零,并将之前保存的数据运算清除
|
|
ui->lineEdit->setText("0");
|
|
waitForOperand = true;
|
|
result = 0.0;
|
|
pendingOperator.clear();
|
|
}
|
|
|
|
void MainWindow::on_equalBtn_clicked()
|
|
{
|
|
double operand = ui->lineEdit->text().toDouble();
|
|
if(pendingOperator.isEmpty())
|
|
return;
|
|
if(!calculate(operand, pendingOperator))
|
|
{
|
|
abortOperation();
|
|
return;
|
|
}
|
|
ui->lineEdit->setText(QString::number(result));
|
|
pendingOperator.clear();
|
|
result = 0.0;
|
|
waitForOperand = true;
|
|
}
|
|
|
|
void MainWindow::on_signBtn_clicked()
|
|
{
|
|
QString text = ui->lineEdit->text();
|
|
double value = text.toDouble();
|
|
if(value > 0)
|
|
{
|
|
text.prepend('-');
|
|
}
|
|
else if(value < 0)
|
|
{
|
|
text.remove(0, 1);
|
|
}
|
|
ui->lineEdit->setText(text);
|
|
}
|
|
|
|
void MainWindow::operatorClicked()
|
|
{
|
|
QPushButton *clickedBtn = qobject_cast<QPushButton *>(sender());
|
|
QString clickedOperator = clickedBtn->text();
|
|
double operand = ui->lineEdit->text().toDouble();
|
|
if(!pendingOperator.isEmpty())
|
|
{
|
|
if(!calculate(operand, pendingOperator))
|
|
{
|
|
abortOperation();
|
|
return;
|
|
}
|
|
ui->lineEdit->setText(QString::number(result));
|
|
}
|
|
else
|
|
{
|
|
result = operand;
|
|
}
|
|
pendingOperator = clickedOperator;
|
|
waitForOperand = true;
|
|
}
|
|
|
|
|
|
void MainWindow::on_pointBtn_clicked()
|
|
{
|
|
if (waitForOperand)
|
|
ui->lineEdit->setText("0");
|
|
if (!ui->lineEdit->text().contains('.'))
|
|
ui->lineEdit->setText(ui->lineEdit->text() + ".");
|
|
waitForOperand = false;
|
|
}
|
|
|
|
void MainWindow::connectSlots()
|
|
{
|
|
|
|
QPushButton *digitBtns[10] = {
|
|
ui->digitBtn0, ui->digitBtn1, ui->digitBtn2, ui->digitBtn3,
|
|
ui->digitBtn4, ui->digitBtn5, ui->digitBtn6, ui->digitBtn7,
|
|
ui->digitBtn8, ui->digitBtn9
|
|
};
|
|
for (auto btn : digitBtns)
|
|
connect(btn, &QPushButton::clicked, this, &MainWindow::digitClicked);
|
|
QPushButton *operatorBtns[4] = {
|
|
ui->addBtn, ui->subtractionBtn, ui->mulBtn, ui->divisionBtn,
|
|
};
|
|
for (auto btn : operatorBtns)
|
|
connect(btn, &QPushButton::clicked, this, &MainWindow::operatorClicked);
|
|
}
|