源码:
头文件: widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMouseEvent>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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.两行都为空输入0
ui->lineEdit_3->setText(QString::number(0));
}
}
测试计算器功能: