Qt计算器完整版

之前的不完整实现:https://www.cnblogs.com/lnlin/p/8151057.html

 首先是界面,Qt Creator直接画就行

然后直接贴代码,具体实现逻辑和之前写的没啥区别,只不过代码更加简略了。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <string>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    QString s1;  // 输入的计算式
    QString calculator();  // 计算结果

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_8_clicked();

    void on_pushButton_9_clicked();

    void on_pushButton_10_clicked();

    void on_pushButton_11_clicked();

    void on_pushButton_12_clicked();

    void on_pushButton_13_clicked();

    void on_pushButton_14_clicked();

    void on_pushButton_16_clicked();

    void on_pushButton_15_clicked();

    void on_pushButton_17_clicked();

    void on_pushButton_18_clicked();

    void on_pushButton_19_clicked();

private:
    Ui::MainWindow *ui;
};

int calculate(std::string s);  // 计算结果

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <string>
#include <vector>
#include <limits.h>
#include <sstream>
#include <algorithm>
#include <stack>
#include <math.h>
#include <iterator>
#include <numeric>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 在计算器界面按键产生的效果
// 1
void MainWindow::on_pushButton_clicked()
{
    s1 += '1';
    ui->lineEdit->setText(s1);
}
// 2
void MainWindow::on_pushButton_2_clicked()
{
    s1 += '2';
    ui->lineEdit->setText(s1);
}
// 3
void MainWindow::on_pushButton_3_clicked()
{
    s1 += '3';
    ui->lineEdit->setText(s1);
}
// 4
void MainWindow::on_pushButton_4_clicked()
{
    s1 += '4';
    ui->lineEdit->setText(s1);
}
// 5
void MainWindow::on_pushButton_5_clicked()
{
    s1 += '5';
    ui->lineEdit->setText(s1);
}
// 6
void MainWindow::on_pushButton_6_clicked()
{
    s1 += '6';
    ui->lineEdit->setText(s1);
}
// 7
void MainWindow::on_pushButton_7_clicked()
{
    s1 += '7';
    ui->lineEdit->setText(s1);
}
// 8
void MainWindow::on_pushButton_8_clicked()
{
    s1 += '8';
    ui->lineEdit->setText(s1);
}
// 9
void MainWindow::on_pushButton_9_clicked()
{
    s1 += '9';
    ui->lineEdit->setText(s1);
}
// 0
void MainWindow::on_pushButton_10_clicked()
{
    s1 += '0';
    ui->lineEdit->setText(s1);
}
// +
void MainWindow::on_pushButton_11_clicked()
{
    s1 += '+';
    ui->lineEdit->setText(s1);
}
// -
void MainWindow::on_pushButton_12_clicked()
{
    s1 += '-';
    ui->lineEdit->setText(s1);
}
// *
void MainWindow::on_pushButton_13_clicked()
{
    s1 += '*';
    ui->lineEdit->setText(s1);
}
// /
void MainWindow::on_pushButton_14_clicked()
{
    s1 += '/';
    ui->lineEdit->setText(s1);
}
// =
void MainWindow::on_pushButton_16_clicked()
{
    s1 += '=';
    ui->lineEdit->setText(s1);
    ui->lineEdit_2->setText(calculator());
}
// clear
void MainWindow::on_pushButton_15_clicked()
{
    s1 = "";
    ui->lineEdit->setText(s1);
    ui->lineEdit_2->setText("");
}
// (
void MainWindow::on_pushButton_17_clicked()
{
    s1 += '(';
    ui->lineEdit->setText(s1);
}
// )
void MainWindow::on_pushButton_18_clicked()
{
    s1 += ')';
    ui->lineEdit->setText(s1);
}
// 回退
void MainWindow::on_pushButton_19_clicked()
{
    s1.chop(1);  // 删除最后一个字符
    ui->lineEdit->setText(s1);
}

QString MainWindow::calculator()
{
    std::string s = s1.toStdString();
    int res = calculate(s);
    return QString::number(res, 10);// 将int转化为QString
}

// 计算一个有效地算式 并返回结果
int calculate(std::string s)
{
    int num = 0, res = 0, n = s.size();
    std::stack<int> st;
    char op = '+';
    for(int i = 0; i < n; i++) {
        char c = s[i];
        if(c >= '0' && c <= '9'){
            num = num * 10 + c - '0';
        }
        else if(c == '(') {
            int j = i, cnt = 0;
            for( ; i < n; i++){
                if(s[i] == '(')
                    cnt++;

                if(s[i] == ')')
                    cnt--;

                if(cnt == 0)
                    break;
            }
            num = calculate(s.substr(j+1,i-j-1));
        }
        if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || i == n-1){
            if(op == '+') st.push(num);
            if(op == '-') st.push(-num);
            if(op == '*' || op == '/'){
                int temp = (op == '*') ? (st.top() * num) : (st.top() / num);
                st.pop();
                st.push(temp);
            }
            op = s[i];
            num = 0;
        }
    }

    while(!st.empty()){
        res += st.top();
        st.pop();
    }

    return res;
}
原文地址:https://www.cnblogs.com/lnlin/p/14046357.html