【qt】计算器的实现

1.计算器界面设计

在这里插入图片描述
由图可知,我们需要20个按钮,一个行编辑文本。
在这里插入图片描述
先摆放好按钮位置,再使用栅格布局
在这里插入图片描述
在这里插入图片描述
按钮全选中使用栅格布局,使其整齐些
在这里插入图片描述
接着修改按钮数字,可以按照计算器格式摆放
在这里插入图片描述
接着我们修改每个对象的名称,待会写代码比较方便,数字的话,直接是
onebutton,twobutton … 删除一位叫cancelonebutton,删除全部叫cancelallbutton,左括号和右括号分别叫做leftbutton ,rightbutton ,no叫做nobutton,+叫做addbutton,-叫做subbutton,*叫做mulbutton,/叫做divbutton,=叫做amountbutton
在这里插入图片描述

2.代码部分

修改完成,下面我们要做的是按下一个按钮,然后输出在行编辑中,我们使用一个字符串,比方说1被按下,然后我们让这个字符串+=‘1’,然后将这个字符串输出在行编辑中,使用到之前说的信号与槽,右击按钮,然后转到槽
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
测试一下,点击单个

单键

同理,使用同样方法实现所有数字和±*/()

void Widget::on_zerobutton_clicked()
{
    str+='0';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_onebutton_clicked()
{
    str+='1';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_twobutton_clicked()
{
    str+='2';
    ui->lineEdit->setText(str);//设置到行文本编辑里面 
}

void Widget::on_threebutton_clicked()
{
    str+='3';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_fourbutton_clicked()
{
    str+='4';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_fivebutton_clicked()
{
    str+='5';
    ui->lineEdit->setText(str);//设置到行文本编辑里面 
}

void Widget::on_sixbutton_clicked()
{
    str+='6';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_sevenbutton_clicked()
{
    str+='7';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_eightbutton_clicked()
{
    str+='8';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_ninebutton_clicked()
{
    str+='9';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_leftbutton_clicked()
{
    str+='(';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_rightbutton_clicked()
{
    str+=')';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_addbutton_clicked()
{
    str+='+';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_divbutton_clicked()
{
    str+='/';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_mulbutton_clicked()
{
    str+='*';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

void Widget::on_subbutton_clicked()
{
    str+='-';
    ui->lineEdit->setText(str);//设置到行文本编辑里面
}

测试:

重复

删除一个和全部删除实现,删除一个使用函数chop,参数为从结尾开始删除几个,chop(1);全部删除使用str.clear(),然后设置字符串进文本编辑中
删除一个:
在这里插入图片描述
全部删除:
在这里插入图片描述

测试:

删除一个和全部

调节大小:
在这里插入图片描述
拖拽移动即可。
设置边框/以及句柄显示
在这里插入图片描述
边框比窗口大一点即可260*300,在构造函数中调用
在这里插入图片描述

显示句柄:名字叫计算器,也在构造函数中添加函数
在这里插入图片描述

在这里插入图片描述
将删除一个我们可以贴图片上去:
我们截屏电脑计算器上的删除键
在这里插入图片描述

将图片保存在该工程对应文件下面,找到图片所在路径,D:\12\calculate
然后使用的函数为
在这里插入图片描述

在这里插入图片描述
该函数也是在构造函数中。
在这里插入图片描述
在这里插入图片描述
在ui界面删掉d
在这里插入图片描述
将图片调大些
在这里插入图片描述
在这里插入图片描述
放不大了,
最后还有一个等号的实现,等号实现就是需要将str字符串中的算式进行运算,然后显示在行编辑中,这里可以参考力扣227基本计算器的实现2
在这里插入图片描述
所需的头文件;
给出等号代码部分:

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

void Widget::on_amountbutton_clicked()
{
    QStack<int> s_num, s_opt;

    char opt[128] = {0};
    int i = 0, tmp = 0, num1, num2;

    //把QString转换成char *
    QByteArray ba;
    ba.append(str);   //把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;
                }
            }
        }
    }
 
    str.clear();
  ui->lineEdit->setText(QString::number(s_num.top()));//int
}

测试:

实现


下面是一个简单的Qt计算器的代码,可以实现加、减、乘、除的基本计算功能: ```cpp #include <QtWidgets> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建窗口 QWidget *window = new QWidget; window->setWindowTitle("Calculator"); // 创建布局 QVBoxLayout *layout = new QVBoxLayout; // 创建显示屏 QLineEdit *display = new QLineEdit; display->setReadOnly(true); display->setAlignment(Qt::AlignRight); layout->addWidget(display); // 创建按钮 QGridLayout *buttonLayout = new QGridLayout; QStringList buttons = {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"}; int row = 0, col = 0; for (const QString &text : buttons) { QPushButton *button = new QPushButton(text); button->setFixedSize(40, 40); buttonLayout->addWidget(button, row, col); col++; if (col > 3) { col = 0; row++; } } layout->addLayout(buttonLayout); // 连接按钮与槽函数 QObject::connect(buttonLayout, &QGridLayout::itemClicked, [&](QLayoutItem *item) { QPushButton *button = qobject_cast<QPushButton *>(item->widget()); if (!button) { return; } QString text = button->text(); if (text == "=") { display->setText(QString::number(eval(display->text()))); } else if (text == ".") { if (!display->text().contains(".")) { display->setText(display->text() + "."); } } else { display->setText(display->text() + text); } }); // 设置窗口布局 window->setLayout(layout); window->show(); return app.exec(); } double eval(const QString &expression) { QRegExp re("([\\d.]+)([+\\-*/])([\\d.]+)"); re.indexIn(expression); double a = re.cap(1).toDouble(); double b = re.cap(3).toDouble(); QString op = re.cap(2); if (op == "+") { return a + b; } else if (op == "-") { return a - b; } else if (op == "*") { return a * b; } else if (op == "/") { return a / b; } else { return 0; } } ``` 上述代码中,`eval` 函数用于计算表达式的值,`buttonLayout` 是放置计算器按钮的布局,每个按钮都连接一个匿名 lambda 表达式,用于响应按钮的点击事件。在 lambda 表达式中,如果点击的是 `=` 按钮,则调用 `eval` 函数计算表达式的值,并将结果显示在显示屏上;如果点击的是 `.` 按钮,则检查显示屏中是否已经包含了小数点,如果没有则在末尾添加一个小数点;否则将按钮的文本添加到显示屏的末尾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#小多子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值