zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    BERT在语义相似度计算中的应用(一)
    Debian 10.6 安装 oracle 19.3c 数据库database软件:传统的zip安装包
    Spring应用消费REST服务
    使用Spring Data自动创建repository实现及自动定义API实现
    SpringBoot中使用Spring profile进行配置【谨慎使用,参见SpringBoot 2.4.0发布文档】
    为SpringBoot声明配置属性的元数据
    【转】Winform中textBox通过正则表达式限制只能输入数字且是两位小数
    【转】WinForm中TextBox只能输入数字
    【转】C# winform窗体间传值(使用委托或事件)
    【转】Visual Studio2019报错/plugin.vs.js,行:1074,错误:缺少标识符、字符串或数字的解决方法
  • 原文地址:https://www.cnblogs.com/lnlin/p/14046357.html
Copyright © 2011-2022 走看看