QT第三个程序 - 表达式计算器

一、main.cpp

cpp 复制代码
#include "winthree.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    WinThree w;
    w.show();
    return a.exec();
}

二、pro文件

cpp 复制代码
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    calcer.cpp \
    main.cpp \
    winthree.cpp

HEADERS += \
    calcer.h \
    winthree.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

三、计算核心.H

cpp 复制代码
#ifndef CALCER_H
#define CALCER_H
#include <QObject>
class Calcer
{
public:
    explicit Calcer();
    double evaluatePostfix( QString postfix);
    QString infixToPostfix( QString infix) ;
    bool isOperator(char c);
    QString Cacle(QString stx);
signals:
};
#endif // CALCER_H

四、计算核心.cpp

cpp 复制代码
#include "calcer.h"
#include <cmath>
#include <QString>
#include<QDebug>
Calcer::Calcer()
{

}
QString Calcer::infixToPostfix(QString infix)
{
    QString output="";
    while (infix.contains('+') || infix.indexOf('-',1)>0
           || infix.contains('*') ||infix.contains('/') ||infix.contains('%'))
    {
        int s1=infix.indexOf('*');
        int s2=infix.indexOf('/');
        if(s1==-1 && s2==-1)
        {
            s1=infix.indexOf('+');
            s2=infix.indexOf('-',1);
        }

        if(s1==-1)            s1=infix.length()+1;
        if(s2==-1)            s2=infix.length()+1;
        int e=qMin(s1,s2);
        int ee=e-1;
        int ss=-1;
        int pleft=-1;
        int pright=-1;
        QString leftStr="";
        QString RightStr="";
        QString Result="";
        ss=0;
        for(int i=e-1;i>=0;i--)
        {
            if(isOperator(infix[i].toLatin1()))
            {
                if(infix[i]=='-')
                {
                    if(i>0 && infix[i-1].isNumber())
                    {
                        ss=i+1;
                    }
                    else
                    {
                        ss=i;
                    }
                }
                else
                {
                    ss=i+1;
                }

                break;
            }
        }
        if(ss>=0)
        {
            for(int k=ss;k<=ee;k++)
            {
                leftStr.append(infix[k]);
            }
        }
        pleft=ss;
        ss=e+1;
        ee=infix.length()-1;
        for(int i=e+1;i<infix.length();i++)
        {
            if(isOperator(infix[i].toLatin1()))
            {
                ee=i-1;
                break;
            }
        }
        pright=ee;
        if(ee>=ss)
        {
            for(int k=ss;k<=ee;k++)
            {
                RightStr.append(infix[k]);
            }
        }
        if(leftStr!="" && RightStr!="")
        {
            Result="";
            if(infix[e]=='*')
            {
                Result=QString::number(leftStr.toDouble()*RightStr.toDouble());
            }
            else if(infix[e]=='/')
            {
                Result=QString::number(leftStr.toDouble()/RightStr.toDouble());
            }
            else if(infix[e]=='+')
            {
                Result=QString::number(leftStr.toDouble()+RightStr.toDouble());
            }
            else if(infix[e]=='-')
            {
                Result=QString::number(leftStr.toDouble()-RightStr.toDouble());
            }
            else if(infix[e]=='%')
            {
                Result=QString::number(leftStr.toInt() % RightStr.toInt());
            }

            infix.remove(pleft,pright-pleft+1);
            infix.insert(pleft,Result);
        }
    }
    output=infix;
    return output;
}
// 判断是否为操作符
bool Calcer::isOperator(char c)
{
    return (c == '+' || c == '-' || c == '*' || c == '/' || c=='%');
}

double Calcer::evaluatePostfix(QString data)
{//-2*9
    while(data.contains('+') || data.indexOf('-',1)>0 || data.contains('*') ||
          data.contains('/') ||data.contains('%') || data.contains('(')|| data.contains(')'))
    {
        while(data.contains('(') || data.contains(')'))
        {
            int s=-1;
            int e=-1;
            for(int i=0;i<data.length();i++)
            {
                if(data[i]==')')
                {
                    e=i;
                    for(int j=e;j>=0;j--)
                    {
                        if(data[j]=='(')
                        {
                            s=j;
                            break;
                        }
                    }
                    if(e>s)
                    {
                        //得到一串最内括号的算试
                        QString sub;
                        for(int k=s+1;k<e;k++)
                        {
                            sub.append(data[k]);
                        }
                            data.remove(s,e-s+1);
                            QString subresult=infixToPostfix(sub);
                            data.insert(s,subresult);
                          break;
                    }
                }
            }
        }
        data.replace("--","+");
        data.replace("+-","-");
        data.replace("-+","-");
        data=infixToPostfix(data);
    }
    return data.toDouble();

}

QString Calcer::Cacle(QString stx="")
{
     double result = evaluatePostfix(stx);
     return QString::number(result);
}

五、界面.h

cpp 复制代码
#ifndef WINTHREE_H
#define WINTHREE_H

#include <QWidget>

class WinThree : public QWidget
{
    Q_OBJECT

public:
    WinThree(QWidget *parent = nullptr);
    ~WinThree();
    QString CalceData(QString st);
private:
    QString Memdata="";
};
#endif // WINTHREE_H

六、界面.cpp

cpp 复制代码
#include "winthree.h"
#include<QPushButton>
#include<QTextEdit>
#include<QDebug>
#include<QtMath>
#include "calcer.h"
#include<QGuiApplication>
#include<QScreen>
WinThree::WinThree(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("计算器");

    QStringList key={"0",".","()","=","1","2","3","+","4","5","6","-","7",
                   "8","9","*","C","%","<","/"};
    QStringList tool={"MC","MR","M+","M-","MS","M^"};
    int k=0;
    this->setFixedSize(335,610);
    QTextEdit *result = new QTextEdit("",this);
    result->resize(315,40);
    result->move(10,100);
    result->setReadOnly(false);
    result->setFont(QFont("黑体",16));
    QTextEdit *hostresult = new QTextEdit("",this);
    hostresult->resize(315,100);
    hostresult->move(10,10);
    hostresult->setReadOnly(true);
    hostresult->setFont(QFont("黑体",16));
    for(int i=0;i<6;i++)
    {
        QPushButton *btn = new QPushButton(tool[k],this);
        btn->resize(50,50);
        btn->move(10+i*53.3,145);
        btn->setFont(QFont("黑体",11));
        connect(btn,&QPushButton::clicked,this,[=](){

            if(tool[k]=="MC")
            {
                Memdata="";
            }
            else if(tool[k]=="MR")
            {
                if(Memdata!="")
                {
                    QString stx=result->toPlainText()+Memdata;
                    result->setText(stx);
                    QTextCursor cr=result->textCursor();
                            qDebug()<<cr.position();
                            cr.setPosition(stx.length());
                    result->setTextCursor(cr);
                }
            }
            else if(tool[k]=="MS")
            {
                Memdata=CalceData(result->toPlainText());
                hostresult->insertPlainText("\n"+Memdata);
                result->setText("");
            }
            else if(tool[k]=="M+")
            {
                if(Memdata=="")Memdata="0";

                    double stx=Memdata.toDouble() +CalceData(result->toPlainText()).toDouble();
                    Memdata=QString::number(stx);
                    hostresult->insertPlainText("\n"+Memdata);
                    result->setText("");


            }
            else if(tool[k]=="M-")
            {
                if(Memdata=="") Memdata="0";
                {
                    double stx=Memdata.toDouble() -CalceData(result->toPlainText()).toDouble();
                    Memdata=QString::number(stx);
                    result->setText(Memdata);
                    QTextCursor cr=result->textCursor();
                            qDebug()<<cr.position();
                            cr.setPosition(result->toPlainText().length());
                    result->setTextCursor(cr);
                }
            }
            else if(tool[k]=="M^")
            {
                if(Memdata=="") Memdata="0";
                {
                    double stx= Memdata.toDouble();
                    int cm=CalceData(result->toPlainText()).toInt();
                    Memdata=QString::number(qPow(stx,cm));
                    result->setText(Memdata);
                    QTextCursor cr=result->textCursor();
                            qDebug()<<cr.position();
                            cr.setPosition(result->toPlainText().length());
                    result->setTextCursor(cr);

                }
            }

        });
        k++;
    }
    k=0;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<4;j++)
        {
            QPushButton *btn = new QPushButton(key[k],this);
            btn->resize(76,76);
            btn->move(10+j*80,height()-86-i*80);
            btn->setFont(QFont("黑体",24));
            if(j==3)//+-*/
            {
                btn->setStyleSheet("color:blue;");
                connect(btn,&QPushButton::clicked,this,[=](){
                    if(key[k]=="=")
                    {
                        QString stx=result->toPlainText();
                        QString rstx=CalceData(stx);
                        stx+=" = "+rstx;
                        stx=hostresult->toPlainText()+"\n"+stx;
                        if(stx.startsWith("\n"))
                           stx.remove(0,1);
                        hostresult->setText(stx);
                        result->setText(rstx);
                        QTextCursor cr=result->textCursor();
                        cr.setPosition(rstx.length());
                        result->setTextCursor(cr);
                        cr=hostresult->textCursor();
                        cr.setPosition(stx.length());
                        hostresult->setTextCursor(cr);
                    }
                    else
                    {
                      QString stx=result->toPlainText();
                      if(stx.endsWith("+") || stx.endsWith("-") || stx.endsWith("*")
                              ||stx.endsWith("/") || stx.endsWith(".") || stx.endsWith("%"))
                      {
                          return;
                      }
                       result->insertPlainText(key[k]);
                    }
                });
            }
            else if(key[k]>="0" && key[k]<="9")
            {
                btn->setStyleSheet("color:red;");
                connect(btn,&QPushButton::clicked,this,[=](){
                    result->insertPlainText(key[k]);
                });
            }
            else
                {
                    btn->setStyleSheet("color:dimgray;");
                    connect(btn,&QPushButton::clicked,this,[=](){
                        if(key[k]=="()")
                        {
                            result->insertPlainText(key[k]);
                            QTextCursor cr=result->textCursor();
                            cr.setPosition(cr.position()-1);
                            result->setTextCursor(cr);

                        }
                        else if(key[k]=="C")
                        {
                            result->setText("");
                        }
                        else if(key[k]=="<")
                        {
                            QString stx=result->toPlainText();
                            if(stx.length()==0)
                                stx="";
                            if(stx.length()>0)
                                stx=stx.left(stx.length()-1);
                            result->setText(stx);
                            QTextCursor cr=result->textCursor();
                            cr.setPosition(stx.length());
                            result->setTextCursor(cr);
                        }
                        else if(key[k]==".")
                        {
                             QString stx=result->toPlainText();
                             if(!stx.endsWith("."))
                             {
                                 result->insertPlainText(key[k]);
                             }

                        }
                        else if(key[k]=="%")
                        {
                             QString stx=result->toPlainText();
                             stx="(("+stx+")/100.00)";
                             result->setText(stx);
                             QTextCursor cr=result->textCursor();
                             cr.setPosition(stx.length());
                             result->setTextCursor(cr);
                        }
                    });
                }

            k++;
        }
    }
    this->move(QGuiApplication::primaryScreen()->size().width()/2-this->width()/2,QGuiApplication::primaryScreen()->size().height()/2-this->height()/2);
}
QString WinThree::CalceData(QString st)
{
    Calcer cl;
    QString result=cl.Cacle(st);
    return result;
}
WinThree::~WinThree()
{
}

七、界面截图

1、

2、

3、

4、

谢谢欣赏!

相关推荐
轩情吖1 小时前
Qt容器类控件之QGroupBox与QTabWidget
开发语言·c++·qt·qgroupbox·qtabwidget·桌面级开发
helloworldandy1 小时前
C++安全编程指南
开发语言·c++·算法
黎雁·泠崖1 小时前
Java核心API之Object类:所有类的根父类
java·开发语言
Remember_9931 小时前
【LeetCode精选算法】位运算专题
java·开发语言·jvm·后端·算法·leetcode
SilentSlot1 小时前
【QT-QML】4. 组件
qt·qml
工程师老罗1 小时前
Pytorch自定义数据集的用法
开发语言·pytorch·python
OnYoung1 小时前
设计模式在C++中的实现
开发语言·c++·算法
曹牧1 小时前
Java:代理转发配置Nginx
java·开发语言·nginx
foundbug9991 小时前
利用MATLAB计算梁单元刚度矩阵并组装成总体刚度矩阵
开发语言·matlab·矩阵