【QT】实战实现四则运算计算器

界面设计如图所示,并修改相应按钮的名字。

在头文件中定义一个全局变量expression,记录输入的所有内容,只有在按下等于号时候才开始计算,在未按之前显示在输入框中。

设置点击1的按钮时候,显示1

设置窗口名字和显示框的字体大小

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("计算器");
    QFont f("仿宋",10);    //字体对象
    ui->mainlineEdit->setFont(f);
}

点击AC按钮会清空输入框,实现代码:

void Widget::on_clearButton_clicked()
{
    expression.clear();
    ui->mainlineEdit->clear();
}

将右上角删除按钮上面的字先删除,在上面添加图片,在Widget函数内写

//在按钮上添加图片
    QIcon con("C:\\Users\\30281\\Desktop\\del.png");
    ui->delButton->setIcon(con);

删除按钮逻辑代码

void Widget::on_delButton_clicked()
{
    expression.chop(1);
    ui->mainlineEdit->setText(expression);
}

改变按钮颜色,同样在在Widget函数内写

 //改变按钮背景颜色
    ui->equalButton->setStyleSheet("background:skyblue");

使用栈来实现计算的功能

在头文件中应用栈库 #include <QStack>

完整代码:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("计算器");
    QFont f("微软雅黑",14);    //字体对象
    ui->mainlineEdit->setFont(f);
    //在按钮上添加图片
    QIcon con("C:\\Users\\30281\\Desktop\\del.png");
    ui->delButton->setIcon(con);
    //改变按钮背景颜色
    ui->equalButton->setStyleSheet("background:skyblue");
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_oneButton_clicked()
{
    expression += "1";
    ui->mainlineEdit->setText(expression);
}

void Widget::on_twoButto_clicked()
{
    expression += "2";
    ui->mainlineEdit->setText(expression);
}

void Widget::on_threeButton_clicked()
{
    expression += "3";
    ui->mainlineEdit->setText(expression);
}

void Widget::on_fourButton_clicked()
{
    expression += "4";
    ui->mainlineEdit->setText(expression);
}


void Widget::on_fiveButton_clicked()
{
    expression += "5";
    ui->mainlineEdit->setText(expression);
}

void Widget::on_sixButton_clicked()
{
    expression += "6";
    ui->mainlineEdit->setText(expression);
}

void Widget::on_sevenButton_clicked()
{
    expression +="7";
    ui->mainlineEdit->setText(expression);
}

void Widget::on_eightButton_clicked()
{
    expression +="8";
    ui->mainlineEdit->setText(expression);
}

void Widget::on_nineButton_clicked()
{
    expression += "9";
    ui->mainlineEdit->setText(expression);
}


void Widget::on_addButton_clicked()
{
    expression += "+";
    ui->mainlineEdit->setText(expression);
}


void Widget::on_subButton_clicked()
{
    expression +="-";
    ui->mainlineEdit->setText(expression);
}

void Widget::on_leftButton_clicked()
{
    expression += "(";
    ui->mainlineEdit->setText(expression);
}


void Widget::on_zeroButton_clicked()
{
    expression += "0";
    ui->mainlineEdit->setText(expression);
}


void Widget::on_rightButton_clicked()
{
    expression +=")";
    ui->mainlineEdit->setText(expression);
}


void Widget::on_mulButton_clicked()
{
    expression += "*";
    ui->mainlineEdit->setText(expression);
}


void Widget::on_divButton_clicked()
{
    expression += "/";
    ui->mainlineEdit->setText(expression);
}


void Widget::on_clearButton_clicked()
{
    expression.clear();
    ui->mainlineEdit->clear();
}

void Widget::on_delButton_clicked()
{
    expression.chop(1);
    ui->mainlineEdit->setText(expression);
}

void Widget::on_equalButton_clicked()
{
    QStack<int> s_num ,s_opt;
    char opt[128]={0};
    int i=0 ,tmp =0 ,num1,num2;

    //把QString 转换成 char *
    QByteArray ba;
    ba.append(expression); //把QString转换成QByteArray
    strcpy(opt, ba.data()); //data可以把QByteArray转换成const char *

    while (opt[i]!='\0' || s_opt.empty()!=true)
    {
        if(opt[i]>='0' && opt[i] <='9')
        {
            tmp = tmp * 10 +opt[i] -'0';
            i++;
            if(opt[i]<'0'||opt[i]>'9')
            {
               s_num.push(tmp);
               tmp=0;
            }
        }
        else //操作符
        {
            if(s_opt.empty() == true ||Priority(opt[i]) > Priority(s_opt.top()) || (s_opt.top() == '(' && opt[i]!= ')'))
            {
                s_opt.push(opt[i]);
                i++;
                continue;
            }
            if(s_opt.top() == '(' && opt[i] == ')')
            {
                s_opt.pop();
                i++;
                continue;
            }
            if(Priority(opt[i]) <=Priority(s_opt.top())|| (opt[i] == ')' && s_opt.top() !='(') || (opt[i] == '\0' && s_opt.empty() !=true))
            {
                char ch=s_opt.top();
                s_opt.pop();
                switch (ch)
                {
                case '+':
                    num1 = s_num.top();
                    s_num.pop();
                    num2 = s_num.top();
                    s_num.pop();
                    s_num.push(num1 + num2);
                    break;
                case '-':
                    num1 = s_num.top();
                    s_num.pop();
                    num2 = s_num.top();
                    s_num.pop();
                    s_num.push(num2 - num1);
                    break;
                case '*':
                    num1 = s_num.top();
                    s_num.pop();
                    num2 = s_num.top();
                    s_num.pop();
                    s_num.push(num1 * num2);
                    break;
                case '/':
                    num1 = s_num.top();
                    s_num.pop();
                    num2 = s_num.top();
                    s_num.pop();
                    s_num.push(num2 / num1);
                    break;

                }
            }
        }
    }
    ui->mainlineEdit->setText(QString::number(s_num.top()));
    expression.clear();
}

int Widget::Priority(char ch)
{
    switch (ch)
    {
    case '(':
        return 3;
    case '*':
    case '/':
        return 2;
    case '+':
    case '-':
        return 1;
    default:
        return 0;

    }
}

补充设置窗口大小,在Widget函数内:

this->setMaximumSize(200,280);
this->setMinimumSize(200,280);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值