写的过程很痛,网上找不到相关的详细的分析,所以想着发一个吧。
一
二
版本看自己喜好了,我的是5.4.2。
三
类名首字母大写。
四
//calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <QMainWindow>
namespace Ui {
class Calculator;
}
class Calculator : public QMainWindow
{
Q_OBJECT
public:
explicit Calculator(QWidget *parent = 0);
~Calculator();
enum FLAG_OPERATOR{
FLAG_OPERATOR_NONE = 0,
FLAG_OPERATOR_ADD,
FLAG_OPERATOR_SUB,
FLAG_OPERATOR_MUL,
FLAG_OPERATOR_DIV
};
private slots:
void on_tb_num0_clicked();
void on_tb_num1_clicked();
void on_tb_num2_clicked();
void on_tb_num3_clicked();
void on_tb_num4_clicked();
void on_tb_num5_clicked();
void on_tb_num6_clicked();
void on_tb_num7_clicked();
void on_tb_num8_clicked();
void on_tb_num9_clicked();
void on_tb_add_clicked();
void on_tb_equ_clicked();
void on_tb_mul_clicked();
void on_tb_clear_clicked();
void on_tb_div_clicked();
void on_tb_sub_clicked();
private:
Ui::Calculator *ui;
void clickedNumber(const QString &t);
void middleResult(void);
void model();
bool m_firstOperator;
QString m_value;
QString m_leftValue;
QString m_rightValue;
FLAG_OPERATOR m_operator;
QString m_expretion;
QString m_result;
int m_model;
};
#endif // CALCULATOR_H
其中用宏代替了“ + - x / ” 槽有0~9和“+ - x / ”
//calculator.cpp
#include "calculator.h"
#include "ui_calculator.h"
Calculator::Calculator(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Calculator)
{
ui->setupUi(this);
on_tb_clear_clicked();
m_model = 0;
}
Calculator::~Calculator()
{
delete ui;
}
void Calculator::on_tb_num0_clicked()
{
clickedNumber(ui->tb_num0->text());
}
void Calculator::on_tb_num1_clicked()
{
clickedNumber(ui->tb_num1->text());
}
void Calculator::on_tb_num2_clicked()
{
clickedNumber(ui->tb_num2->text());
}
void Calculator::on_tb_num3_clicked()
{
clickedNumber(ui->tb_num3->text());
}
void Calculator::on_tb_num4_clicked()
{
clickedNumber(ui->tb_num4->text());
}
void Calculator::on_tb_num5_clicked()
{
clickedNumber(ui->tb_num5->text());
}
void Calculator::on_tb_num6_clicked()
{
clickedNumber(ui->tb_num6->text());
}
void Calculator::on_tb_num7_clicked()
{
clickedNumber(ui->tb_num7->text());
}
void Calculator::on_tb_num8_clicked()
{
clickedNumber(ui->tb_num8->text());
}
void Calculator::on_tb_num9_clicked()
{
clickedNumber(ui->tb_num9->text());
}
void Calculator::clickedNumber(const QString &t)
{
m_value += t;
m_expretion += t;
ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_add_clicked()
{
middleResult();
m_operator = FLAG_OPERATOR_ADD;
m_expretion += ui->tb_add->text();
ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_mul_clicked()
{
middleResult();
m_operator = FLAG_OPERATOR_MUL;
m_expretion += ui->tb_mul->text();
ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_div_clicked()
{
middleResult();
m_operator = FLAG_OPERATOR_DIV;
m_expretion += ui->tb_div->text();
ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_sub_clicked()
{
middleResult();
m_operator = FLAG_OPERATOR_SUB;
m_expretion += ui->tb_sub->text();
ui->lb_expretion->setText(m_expretion);
}
void Calculator::middleResult()
{
if(m_firstOperator)
{
m_firstOperator = false;
m_leftValue = m_value;
m_value.clear();
}else
{
m_rightValue = m_value;
m_value.clear();
switch (m_operator) {
case FLAG_OPERATOR_ADD:
m_leftValue = QString::number(m_leftValue.toInt() + m_rightValue.toInt());
on_tb_equ_clicked();
break;
case FLAG_OPERATOR_SUB:
m_leftValue = QString::number(m_leftValue.toInt() - m_rightValue.toInt());
on_tb_equ_clicked();
break;
case FLAG_OPERATOR_MUL:
m_leftValue = QString::number(m_leftValue.toInt() * m_rightValue.toInt());
on_tb_equ_clicked();
break;
case FLAG_OPERATOR_DIV:
if(m_rightValue == "0")
{
Calculator::on_tb_clear_clicked();
ui->lb_result->setText("除数不能为0");
}
else
{
m_leftValue = QString::number(m_leftValue.toInt() / m_rightValue.toInt());
on_tb_equ_clicked();
}
break;
default:
break;
}
}
}
void Calculator::on_tb_equ_clicked()
{
m_rightValue = m_value;
m_value.clear();
switch (m_operator) {
case FLAG_OPERATOR_ADD:
m_result = QString::number(m_leftValue.toInt() + m_rightValue.toInt());
break;
case FLAG_OPERATOR_MUL:
m_result = QString::number(m_leftValue.toInt() * m_rightValue.toInt());
break;
case FLAG_OPERATOR_DIV:
m_result = QString::number(m_leftValue.toInt() / m_rightValue.toInt());
break;
case FLAG_OPERATOR_SUB:
m_result = QString::number(m_leftValue.toInt() - m_rightValue.toInt());
break;
default:
break;
}
ui->lb_result->setText(m_result);
}
void Calculator::on_tb_clear_clicked()
{
m_firstOperator = true;
m_operator = FLAG_OPERATOR_NONE;
m_value.clear();
m_expretion.clear();
m_result.clear();
m_leftValue.clear();
m_rightValue.clear();
ui->lb_expretion->setText("0");
ui->lb_result->setText("0");
}
四则运算部分:将运算部分封装到了on_tb_equ_clicked()即“=”的槽中(偷个懒~~~),on_tb_clear_clicked()函数实现运算符左,右值的清除和两个显示
窗口的内容清除。
错误报告部分:除数不能为0
case FLAG_OPERATOR_DIV:
if(m_rightValue == "0")
{
Calculator::on_tb_clear_clicked();
ui->lb_result->setText("除数不能为0");
}
else
{
m_leftValue = QString::number(m_leftValue.toInt() / m_rightValue.toInt());
on_tb_equ_clicked();
}
break;
还有一些儿我没写(偷懒)比如:连续输入运算符错误;结果的数值过大无法正常显示;
//main.cpp
#include "calculator.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Calculator w;
w.show();
return a.exec();