一、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、
谢谢欣赏!