6.9-QT模拟计算器
源码:
头文件: widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMouseEvent>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_btn_0_clicked();void on_btn_1_clicked();void on_btn_2_clicked();void on_btn_3_clicked();void on_btn_4_clicked();void on_btn_5_clicked();void on_btn_6_clicked();void on_btn_7_clicked();void on_btn_8_clicked();void on_btn_9_clicked();void on_btn_clear_clicked();void on_btn_dot_clicked();void on_btn_back_clicked();void on_btn_add_clicked();void on_btn_sub_clicked();void on_btn_div_clicked();void on_btn_mul_clicked();void on_btn_mod_clicked();void on_btn_equal_clicked();void setText(const QString& str);void changeLine(const QChar& c);private:Ui::Widget *ui;int flag = 0; //0-聚焦于lineEdit, 1-聚焦于lineEdit_2, 2-计算完毕.需要清空后重新计算QChar sign;
};
#endif // WIDGET_H
源文件:widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::setText(const QString& str) {if (flag == 0) {QString s = ui->lineEdit->text();ui->lineEdit->setText(s += str);} else if (flag == 1) {QString s = ui->lineEdit_2->text();ui->lineEdit_2->setText(s += str);}
}void Widget::on_btn_0_clicked()
{setText("0");
}void Widget::on_btn_1_clicked()
{setText("1");
}void Widget::on_btn_2_clicked()
{setText("2");
}void Widget::on_btn_3_clicked()
{setText("3");
}void Widget::on_btn_4_clicked()
{setText("4");
}void Widget::on_btn_5_clicked()
{setText("5");
}void Widget::on_btn_6_clicked()
{setText("6");
}void Widget::on_btn_7_clicked()
{setText("7");
}void Widget::on_btn_8_clicked()
{setText("8");
}void Widget::on_btn_9_clicked()
{setText("9");
}void Widget::on_btn_clear_clicked()
{ui->lineEdit->setText("");ui->lineEdit_2->setText("");ui->lineEdit_3->setText("");this->flag = 0;this->sign = '\0';
}void Widget::on_btn_dot_clicked()
{QString s;if (flag == 0) {s = ui->lineEdit->text();} else if (flag == 1){s = ui->lineEdit_2->text();}if (s == nullptr || s == " ") {s += "0.";if (flag == 0) {ui->lineEdit->setText(s);} else if (flag == 1){ui->lineEdit_2->setText(s);}}if (!s.contains(".")) {if (flag == 0) {ui->lineEdit->setText(s += '.');} else if (flag == 1){ui->lineEdit_2->setText(s += '.');}}
}void Widget::on_btn_back_clicked()
{QString s;if (flag == 0) {s = ui->lineEdit->text();ui->lineEdit->setText(s.removeLast());} else if (flag == 1){s = ui->lineEdit_2->text();ui->lineEdit_2->setText(s.removeLast());}
}void Widget::changeLine(const QChar &c)
{if (this->sign.isNull() && c == '-') {//1.若第一行为空,则第一个数为负数, 否则做为减号运算符QString s = ui->lineEdit->text();if (s == "") {ui->lineEdit->setText(s += c);} else {this->sign = c;this->flag = 1;}} else if (!this->sign.isNull() && c == '-') {//2.若第二行为空,则第二个数是负数,否则不做处理QString s = ui->lineEdit_2->text();if (s == "") {ui->lineEdit_2->setText(s += c);}} else if (this->sign.isNull()) { //若还没做过运算,且第一行非空,则转到第二行,若为空则不做处理QString s = ui->lineEdit->text();if (s != "") {this->sign = c;this->flag = 1;}}
}void Widget::on_btn_add_clicked()
{changeLine('+');
}void Widget::on_btn_sub_clicked()
{changeLine('-');
}void Widget::on_btn_div_clicked()
{changeLine('/');
}void Widget::on_btn_mul_clicked()
{changeLine('*');
}void Widget::on_btn_mod_clicked()
{changeLine('%');
}void Widget::on_btn_equal_clicked()
{QString s1 = ui->lineEdit->text().trimmed();QString s2 = ui->lineEdit_2->text().trimmed();double a, b, res;if (flag == 1 && s1 != "" && s2 !="") {//1.两行数都正常输入a = s1.toDouble();b = s2.toDouble();switch(sign.unicode()) {case '+':res = a + b;break;case '-':res = a - b;break;case '*':res = a * b;break;case '/':res = a / b;break;case '%':res = static_cast<int>(a) % static_cast<int>(b);break;default:throw std::runtime_error("未知运算符异常!");}ui->lineEdit_3->setText(QString::number(res));flag = 2;} else if (flag == 0 && s1 != "") {//2.只有第一行有输入,则直接取第一行为结果res = s1.toDouble();ui->lineEdit_3->setText(QString::number(res));} else if (flag == 0 && s1 == "") {//3.两行都为空输入0ui->lineEdit_3->setText(QString::number(0));}
}
测试计算器功能: