Qt课程设计--用qt实现计算器的功能

先展示一下运行的结果

实现了加减乘除、小数点、括号、返回、清楚等功能 

下面来展示代码

calculator.h      代码比较多但很多都是重复的,主要看等于号那边如何实现

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QPushButton>
#include<QLineEdit>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QGridLayout>
#include<QString>
#include<QStack>
#include <vector>

using namespace std;

class calculator : public QMainWindow

{

    Q_OBJECT

public:

    calculator(QWidget *parent = 0);

    ~calculator();

    char nows;//现在对应的符号
    int zuo = 0, you = 0;//左括号和右括号
    int ENDS = 0, hh=0;
    int mark;
    vector<char>biaodashi;//用于计算的表达式存放在这里

private:

      QLineEdit *inputLine;//显示框

      QString input=" "; //输入框

      bool flat=false;

      //0-9按钮

      QPushButton *zeroButton;

      QPushButton *oneButton;

      QPushButton *twoButton;

      QPushButton *threeButton;

      QPushButton *fourButton;

      QPushButton *fiveButton;

      QPushButton *sixButton;

      QPushButton *sevenButton;

      QPushButton *eightButton;

      QPushButton *nineButton;

      QPushButton *addButton;

      QPushButton *subButton;

      QPushButton *divButton;

      QPushButton *mulButton;

      QPushButton *equButton;

      QPushButton *decButton;

      QPushButton *CEButton;

      QPushButton *ACButton;

      QPushButton *lefButton;

      QPushButton *rigButton;



private slots:


      double calculate(int x, int y);//

      double number1(int start, int end);//

      double panduan(int start, double number, int y);

      void solve(int x, int y, double num);

      void buttonZeroClicked();

      void buttonOneClicked();

      void buttonTwoClicked();

      void buttonThreeClicked();

      void buttonFourClicked();

      void buttonFiveClicked();

      void buttonSixClicked();

      void buttonSevenClicked();

      void buttonEightClicked();

      void buttonNineClicked();

      void buttonAddClicked();//+

      void buttonSubClicked();//-

      void buttonMulClicked();//乘

      void buttonDivClicked();//除

      void buttonDecClicked();//小数点

      void buttonEquClicked();//等于号

      void buttonLefClicked();//左括号

      void buttonRigClicked();//右括号

      void buttonCEClicked();//CE

      void buttonACClicked();//AC

};



#endif // MAINWINDOW_H

 

 calculator.cpp

#include "calculator.h"
#include<iostream>
#include<vector>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<sstream>

using namespace std;


calculator::calculator(QWidget *parent) : QMainWindow(parent)

{

       QWidget *widget=new QWidget; //构建一个QWidget布局将设置的布局添加进这个QWidget

       this->setCentralWidget(widget);


       inputLine=new QLineEdit;

       inputLine->setText(input);

       zeroButton=new QPushButton("0");

       oneButton=new QPushButton("1");

       twoButton=new QPushButton("2");

       threeButton=new QPushButton("3");

       fourButton=new QPushButton("4");

       fiveButton=new QPushButton("5");

       sixButton=new QPushButton("6");

       sevenButton=new QPushButton("7");

       eightButton=new QPushButton("8");

       nineButton=new QPushButton("9");

       decButton=new QPushButton(".");

       addButton=new QPushButton("+");

       subButton=new QPushButton("-");

       mulButton=new QPushButton("*");

       divButton=new QPushButton("/");

       equButton=new QPushButton("=");

       lefButton=new QPushButton("(");

       rigButton=new QPushButton(")");

       CEButton=new QPushButton("CE");

       ACButton=new QPushButton("AC");



       QGridLayout *H=new QGridLayout(this); //声明了一个网格布局

       inputLine->setFixedHeight(50); //

       H->addWidget(inputLine,0,0,1,5);

       H->setRowStretch(0,100);


       H->addWidget(oneButton,1,0);

       H->addWidget(twoButton,1,1);

       H->addWidget(threeButton,1,2);

       H->addWidget(CEButton,1,3);

       H->addWidget(ACButton,1,4);


       H->addWidget(fourButton,2,0);

       H->addWidget(fiveButton,2,1);

       H->addWidget(sixButton,2,2);

       H->addWidget(addButton,2,3);

       H->addWidget(subButton,2,4);


       H->addWidget(sevenButton,3,0);

       H->addWidget(eightButton,3,1);

       H->addWidget(nineButton,3,2);

       H->addWidget(mulButton,3,3);

       H->addWidget(divButton,3,4);


       H->addWidget(zeroButton,4,0);

       H->addWidget(decButton,4,1);

       H->addWidget(lefButton,4,2);

       H->addWidget(rigButton,4,3);

       H->addWidget(equButton,4,4);



       widget->setLayout(H); //将布局显示出来



       connect(zeroButton,SIGNAL(clicked()),this,SLOT(buttonZeroClicked()));//信号与槽函数

       connect(oneButton,SIGNAL(clicked()),this,SLOT(buttonOneClicked()));

       connect(twoButton,SIGNAL(clicked()),this,SLOT(buttonTwoClicked()));

       connect(threeButton,SIGNAL(clicked()),this,SLOT(buttonThreeClicked()));

       connect(fourButton,SIGNAL(clicked()),this,SLOT(buttonFourClicked()));

       connect(fiveButton,SIGNAL(clicked()),this,SLOT(buttonFiveClicked()));

       connect(sixButton,SIGNAL(clicked()),this,SLOT(buttonSixClicked()));

       connect(sevenButton,SIGNAL(clicked()),this,SLOT(buttonSevenClicked()));

       connect(eightButton,SIGNAL(clicked()),this,SLOT(buttonEightClicked()));

       connect(nineButton,SIGNAL(clicked()),this,SLOT(buttonNineClicked()));



       connect(addButton,SIGNAL(clicked()),this,SLOT(buttonAddClicked()));

       connect(subButton,SIGNAL(clicked()),this,SLOT(buttonSubClicked()));

       connect(mulButton,SIGNAL(clicked()),this,SLOT(buttonMulClicked()));

       connect(divButton,SIGNAL(clicked()),this,SLOT(buttonDivClicked()));


       connect(decButton,SIGNAL(clicked(bool)),this,SLOT(buttonDecClicked()));//点号



       connect(lefButton,SIGNAL(clicked(bool)),this,SLOT(buttonLefClicked()));//左括号

       connect(rigButton,SIGNAL(clicked(bool)),this,SLOT(buttonRigClicked()));//右括号

       connect(CEButton,SIGNAL(clicked()),this,SLOT(buttonCEClicked()));

       connect(ACButton,SIGNAL(clicked()),this,SLOT(buttonACClicked()));

       connect(equButton,SIGNAL(clicked()),this,SLOT(buttonEquClicked())); //等于号*/

}

void calculator::buttonOneClicked()
{

    nows = '1';
    biaodashi.push_back(nows);//把1放入容器尾部
    input += '1';
    ENDS++;
    inputLine->setText(input);

}

void calculator::buttonTwoClicked()
{

    nows = '2';
    biaodashi.push_back(nows);//把2放入容器尾部
    input += '2';
    ENDS++;
    inputLine->setText(input);

}

void calculator::buttonThreeClicked()
{

    nows = '3';
    biaodashi.push_back(nows);//把3放入容器尾部
    input += '3';
    ENDS++;
    inputLine->setText(input);

}

void calculator::buttonFourClicked()
{

    nows = '4';
    biaodashi.push_back(nows);//把4放入容器尾部
    input += '4';
    ENDS++;
    inputLine->setText(input);

}

void calculator::buttonFiveClicked()
{

    nows = '5';
    biaodashi.push_back(nows);//把5放入容器尾部
    input += '5';
    ENDS++;
    inputLine->setText(input);

}


void calculator::buttonSixClicked()
{
    nows = '6';
    biaodashi.push_back(nows);//把6放入容器尾部
    input += '6';
    ENDS++;
    inputLine->setText(input);

}

void calculator::buttonSevenClicked()
{
    nows = '7';
    biaodashi.push_back(nows);//把7放入容器尾部
    input += '7';
    ENDS++;
    inputLine->setText(input);
}

void calculator::buttonEightClicked()
{
    nows = '8';
    biaodashi.push_back(nows);//把8放入容器尾部
    input += '8';
    ENDS++;
    inputLine->setText(input);
}

void calculator::buttonNineClicked()
{
    nows = '9';
    biaodashi.push_back(nows);//把9放入容器尾部
    input += '9';
    ENDS++;
    inputLine->setText(input);
}

void calculator::buttonZeroClicked()
{
    nows = '0';
    biaodashi.push_back(nows);//把0放入容器尾部
    input += '0';
    ENDS++;
    inputLine->setText(input);
}

void calculator::buttonAddClicked()
{
    nows = '+';
    biaodashi.push_back(nows);//把+放入容器尾部
    input += '+';
    ENDS++;
    inputLine->setText(input);
}

void calculator::buttonSubClicked()
{
    nows = '-';
    biaodashi.push_back(nows);//把-放入容器尾部
    input += '-';
    ENDS++;
    inputLine->setText(input);
}

void calculator::buttonMulClicked()
{
    nows = '*';
    biaodashi.push_back(nows);//把*放入容器尾部
    input += '*';
    ENDS++;
    inputLine->setText(input);
}

void calculator::buttonDivClicked()
{
    nows = '/';
    biaodashi.push_back(nows);//把/放入容器尾部
    input += '/';
    ENDS++;
    inputLine->setText(input);
}

void calculator::buttonDecClicked() //小数点
{
    nows = '.';
    biaodashi.push_back(nows);//把.放入容器尾部
    input += '.';
    ENDS++;
    inputLine->setText(input);
}

void calculator::buttonLefClicked()
{
    nows = '(';
    biaodashi.push_back(nows);//把(放入容器尾部
    input += '(';
    ENDS++;
    zuo++;
    inputLine->setText(input);
}

void calculator::buttonRigClicked()
{
    nows = ')';
    biaodashi.push_back(nows);//把)放入容器尾部
    input += ')';
    ENDS++;
    you++;
    inputLine->setText(input);
}

void calculator::buttonCEClicked()
{
    biaodashi.erase(biaodashi.end() - 1 );
    ENDS--;
    input = input.left(input.length()-1); //减去一字符
    inputLine->setText(input);
}

void calculator::buttonACClicked() //直接清空
{
    input='0';
    inputLine->setText(input);
}

void calculator::buttonEquClicked()//等于号
{
    nows = '=';
    biaodashi.push_back(nows);
    if (hh == 0)
    {
        hh = 1;
        biaodashi.push_back(' ');
    }
    ENDS++;
    input += '=';
    inputLine->setText(input);

    int i, j;
    double rs;
    if (zuo != you)
    {
        input=input+"=Error";
        inputLine->setText(input);
    }
    else
        while (zuo > 0)
        {
        for (i = 0; i < ENDS; i++)
            if (biaodashi[i] == '(')
            {

            for (j = i; j <= ENDS; j++)
                if (biaodashi[j] == ')')
                {

                calculate(i + 1, j-1);//计算括号里的内容

                break;
                }

            break;
            }
        zuo--;
        you--;
        }

    if (zuo == 0 && you == 0)
        rs = calculate(0, ENDS);
    input=input+QString::number(rs);
    inputLine->setText(input);


}

double calculator::calculate(int x, int y)
{
    int starts, start;//起点
    start = x;
    mark = x;//数字的结尾
    double num1, num2, num3;

    num1 = number1(start, y);//初始化num1
    start = mark;
    starts = start;//最初的起点
    //中间符号

    while (mark < y)
    {
        /*num1 = number1(start, y);
        start = mark;*/
        start ++;
        num2 = number1(start, y);
        start = mark;

        if (biaodashi[start] == '*' || biaodashi[start] == '/')
        {
            start++;
            num2 = panduan(start , num2, y);
            start = mark;
        }


            if (biaodashi[starts] == '+')
                num1 = num1 + num2;
            else
                if (biaodashi[starts] == '-')
                    num1 = num1 - num2;
                else
                    if (biaodashi[starts] == '*')
                        num1 = num1 * num2;
                    else
                        if (biaodashi[starts] == '/')
                            num1 = num1 /(int) num2;


            starts = mark;//变更初始符号

        num3 = num1;

        if (biaodashi[mark + 1] == '='||biaodashi[mark]=='=')
            break;

    }

    if (zuo!=0)
        solve(x-1, y+1, num3);

    return num3;
}

double calculator::number1(int start, int end)
{

    int i;
    i = start;//
    string num = "";
    double temp;
    while ((biaodashi[start] >= '0'&&biaodashi[start]<='9') || biaodashi[start] == '.')
    {
        num += biaodashi[start];
        start++;//后一个字符
        mark = start;
        //记录下数字d后一个的位置
    }
    temp = atof(num.c_str());//转double

    /*if (i-1>=0)
    if (biaodashi[i - 1] == '-')
        temp = 0 - temp;*/

    return temp;

}

double calculator::panduan(int start, double number, int y)
{
    double num3;
    if (biaodashi[start-1] == '*')//前一个符号
    {
        num3 = number1(start, y);
        start = mark;
        num3 = number*num3;
    }
    else
    {
        num3 = number1(start, y);
        start = mark;
        num3 = number / (int)num3;
    }

    if (biaodashi[start] == '*' || biaodashi[start] == '/')
        num3 = panduan(start+1, num3,y);

    return num3;
}

void calculator::solve(int x, int y, double num)
{
    QString b=QString::number(num);

    QByteArray cpath = b.toLocal8Bit();
    char*buffer = cpath.data();

    int len;
    len = strlen(buffer);
    biaodashi.erase(biaodashi.begin() + x, biaodashi.begin() + y+1);
    ENDS = ENDS - y + x;

    for (int i = 0; i < len; i++)//有个\0
    {
        biaodashi.insert(biaodashi.begin() + x, buffer[i]);
        ENDS++;
        x++;
    }

    return ;
}

calculator::~calculator()

{



}


 

main.cpp

#include "calculator.h"

#include <QApplication>



int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    calculator w;

    w.show();



    return a.exec();

}

等有时间把这篇代码简单分析一下,更清楚的展示出来 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值