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、

谢谢欣赏!

相关推荐
aq553560024 分钟前
Laravel10.x重磅升级,新特性一览
android·java·开发语言
报错小能手1 小时前
ios开发方向——swift错误处理:do/try/catch、Result、throws
开发语言·学习·ios·swift
老歌老听老掉牙1 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
网域小星球1 小时前
C 语言从 0 入门(十七)|结构体指针 + 动态内存 + 文件综合实战
c语言·开发语言·文件操作·结构体指针·动态内存·综合项目
aq55356001 小时前
三大编程语言深度对比:C# vs 易语言 vs 汇编
开发语言·汇编·c#
独特的螺狮粉1 小时前
云隙一言:鸿蒙Flutter框架 实现的随机名言应用
开发语言·flutter·华为·架构·开源·harmonyos
光泽雨2 小时前
c# 文件编译的过程
开发语言·c#
赤水无泪2 小时前
09 C++ 11 新增的标准
开发语言
格林威2 小时前
工业相机 SDK 在 Docker 容器中的部署与权限配置(含 USB/GigE)
开发语言·人工智能·数码相机·计算机视觉·docker·容器·工业相机
哎嗨人生公众号2 小时前
手写求导公式,让轨迹优化性能飞升,150ms变成9ms
开发语言·c++·算法·机器人·自动驾驶