QT 计算器的简单实现,多个数进行运算 (笔记)

目录

简单布个局

数据按键的处理

等号按键,做最后的计算

简单布个局

数据按键的处理

像这种超级多的按键,直接搞个按钮组添加(参数:按键,按键编号):

QButtonGroup *bg;
    bg->addButton(ui->bt0,0);
    bg->addButton(ui->bt1,1);
    bg->addButton(ui->bt2,2);
    bg->addButton(ui->bt3,3);
    bg->addButton(ui->bt4,4);
    bg->addButton(ui->bt5,5);
    bg->addButton(ui->bt6,6);
    bg->addButton(ui->bt7,7);
    bg->addButton(ui->bt8,8);
    bg->addButton(ui->bt9,9);
    bg->addButton(ui->btpoint,10);//添加的一些运算符
    bg->addButton(ui->btjian,11);
    bg->addButton(ui->btchen,12);
    bg->addButton(ui->btchu,13);

 然后建立一个槽响应这个按钮组的信号:

connect(bg,SIGNAL(buttonClicked(int)),this,SLOT(get_id(int)));

各个数据按键信号的处理,get_id()实现:

void MainWindow::get_id(int arg)
{
    if(num.length()<30)//num是输入的数据,在这里搞个最长小于30
    {
        if(arg==10)//符号数据的加入
        {
            num.append(".");
        }else if(arg==11){
            num.append("-");
        }else if(arg==12){
            num.append("*");
        }else if(arg==13){
            num.append("/");
        }else{
            num.append(QString::number(arg));//按键数字啥的加进来
        }
    }
    ui->label_2->setText(num);//label_2显示输入的数据
}

慢着,加号漏了,写个单独槽算了:

void MainWindow::on_btjia_clicked()
{
    num.append("+");
    ui->label_2->setText(num);
}

等号按键,做最后的计算

void MainWindow::on_btdeng_clicked()
{
    QMap<int,int> m;//计算顺序
    double number=0;
    QRegExp Separator = QRegExp("[+*/-]");//字符串多字符切割,一次把各个数据全部取出来
    QStringList list = num.split(Separator, QString::SkipEmptyParts);//QString字符串对字符分割函数;
    int aa[4][5]={{0}};//用二维数组记录各个符号的位置,每个符号最多记录五次
    //代号:         0   1   2   3  相当于表头
    char array[]={'+','-','*','/'}; //需要去除的字符

    for(int i=0;i<4;i++)//循环四次,分别找出运算符的位置
    {
        QString tmp = QString(array[i]);
        int b=0;
        while(num.contains(tmp))//还存在该符号,就记录下来,直到没有
        {
            aa[i][b+1]=num.indexOf(tmp);
            //一次替换一个
            int idx = 0;
            idx = num.indexOf(tmp, 0);
            if (-1 != idx)
            {
                num.replace(idx, 1, ">");//已记录的符号用>替换掉,而不改变总体长度
            }
            b++;
        }
        aa[i][0]=b;
    }

    //取出记录的符号位置,规定计算顺序
    for (int i=0;i<aa[0][0];i++) {
        m.insert(aa[0][i+1],0);
    }
    for (int i=0;i<aa[1][0];i++) {
        m.insert(aa[1][i+1],1);
    }
    for (int i=0;i<aa[2][0];i++) {
        m.insert(aa[2][i+1],2);
    }
    for (int i=0;i<aa[3][0];i++) {
        m.insert(aa[3][i+1],3);
    }

    //第一个数为负数时,防止list越界,这里单独替换它
    if(num[0]=='>')
    {
        list[0]=QString("%1%2").arg("-").arg(list[0]);
        auto it=m.begin();
        m.remove(it.key());
        aa[1][0]--;
    }

    //好了有了各个运算符号的位置,还有其优先级,开始计算
    for (int i=0;i<(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]);i++)
    {
        int j=0;
        for(auto it=m.begin();it!=m.end();++it)
        {
            if(it.value()==2)//先计算乘法
            {
                int doublejude=0;
                if(list[j].toDouble()<0)
                {
                    doublejude++;
                }
                if(list[j+1].toDouble()<0)
                {
                    doublejude++;
                }
                number=qAbs(list[j].toDouble())*qAbs(list[j+1].toDouble());
                m.remove(it.key());
                list.removeAt(j);
                list.removeAt(j);
                if(doublejude==1)
                {
                    number=-number;
                }
                list.insert(j,QString::number(number));
                break;
            }else if(it.value()==3)//再计算除法除法
            {
                int doublejude=0;
                if(list[j].toDouble()<0)
                {
                    doublejude++;
                }
                if(list[j+1].toDouble()<0)
                {
                    doublejude++;
                }
                number=qAbs(list[j].toDouble())/qAbs(list[j+1].toDouble());
                m.remove(it.key());
                list.removeAt(j);
                list.removeAt(j);
                if(doublejude==1)
                {
                    number=-number;
                }
                list.insert(j,QString::number(number));
                break;
            }else{
                j++;
            }
        }
    }
    number=0;
    for (int i=0;i<(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]);i++)
    {
        int j=0;
        for(auto it=m.begin();it!=m.end();++it)
        {
            if(it.value()==0)//然后加法
            {
                number=list[j].toDouble()+list[j+1].toDouble();
                m.remove(it.key());
                list.removeAt(j);
                list.removeAt(j);
                list.insert(j,QString::number(number));
                break;
            }else if(it.value()==1)//最后减法
            {
                number=list[j].toDouble()-list[j+1].toDouble();
                m.remove(it.key());
                list.removeAt(j);
                list.removeAt(j);
                list.insert(j,QString::number(number));
                break;
            }else{
                j++;
            }
        }
    }
    num=list[0];
    ui->label_2->setText(num);//得到的结果显示
}

最后来看看运行效果

按下等于就出来啦

 

好了以上就是计算器的简单实现了


 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值