使用qt实现四则运算计算机项目

这是我们要包含的头文件

cpp 复制代码
#include <QWidget>
#include<QStack>
#include<string.h>
#include<string>

这是我在ui界面创建的计算机基础框架。

接下来要实现按住每个按钮在白框内显示;

因此我们要定义一个QString 类型的变量

cpp 复制代码
QString expression;

接下来是我对每个按钮的实现

cpp 复制代码
void Widget::on_one_clicked()
{
    expression+="1";
    ui->lineEdit->setText(expression);
}


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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

C键的实现

cpp 复制代码
void Widget::on_clear_clicked()
{
    expression.clear();
    ui->lineEdit->clear();
}

先对expression清空,再清空白框。

删除键的实现

cpp 复制代码
void Widget::on_deletebutton_clicked()
{
    expression.chop(1);
    ui->lineEdit->setText(expression);
}

使用chop可以吃掉最后一个。

以下是最难的一个件,=键

这里的代码使用了我之前用栈实现四则运算的代码。

cpp 复制代码
char str[128]={0};

先定义一个char *类型

cpp 复制代码
qstrcpy(str, expression.toUtf8().data());

使用这个可以把QString类型转换为char*类型

以下就是实现步骤

思路就是创建一个操作符栈,数字栈。

如果该操作符的优先级高于栈顶的操作符,则该操作符入栈。

否则栈顶的操作符出栈,并把数字栈的前两个数字出栈运算。

再把结果放入数字栈。

cpp 复制代码
float n1, n2, tmp = 0;
    int  priority;
    char op;
    QStack<float> numS;
    QStack<char> opS;
    int mylength=strlen(str);
    for (int i = 0; i <mylength ; i++)
    {
        if (str[i] >= '0' && str[i] <= '9')
        {
            tmp = tmp * 10 + float(str[i] - '0');
        }
        else
        {
            numS.push(tmp);
            priority = getpriority(str[i]);
            while (!opS.empty() && priority <= getpriority(opS.top()))
            {
                op = opS.top();
                opS.pop();
                n2 = numS.top();
                numS.pop();
                n1 = numS.top();
                numS.pop();
                n1 = cal_one(n1, op, n2);
                numS.push(n1);
            }
            opS.push(str[i]);
            tmp = 0;
        }

    }

    // 处理最后一个数字
    numS.push(tmp);

    // 计算剩余的表达式
    while (!opS.empty())
    {
        op = opS.top();
        opS.pop();
        n2 = numS.top();
        numS.pop();
        n1 = numS.top();
        numS.pop();
        float result = cal_one(n1, op, n2);
        numS.push(result);
    }

    ui->lineEdit->setText(QString::number(numS.top()));
}

int Widget::getpriority(char ch)
{
    int priority = -1;//-1代表没有找到对应的运算符
    if (ch == '+' || ch == '-')
    {
        priority = 1;
    }
    else if(ch=='*'||ch=='/')
    {
        priority = 2;
    }
    return priority;
}
int Widget::cal_one(float n1, char op, float n2)
{
    float result = 0;
    switch (op) {
    case '+':
        result = n1 + n2;
        break;

    case '-':
        result = n1 - n2;
        break;
    case '*':
        result = n1 * n2;
        break;
    case '/':
        result = n1 / n2;
        break;
    }
    return result;
}
cpp 复制代码
ui->lineEdit->setText(QString::number(numS.top()));
}

这一步可以把int类型转为QString 类型。

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //按钮放图片
    QIcon con("C:\\Users\\15322\\Pictures\\Screenshots\\tt.PNG");
    ui->deletebutton->setIcon(con);
    //ui->equal->setStyleSheet("backgroup:blue");
}

这一步可以再按钮上放图片。

一下就是结果

相关推荐
嘉琪00118 小时前
Day1 完整学习包(var/let/const + 作用域)——2026 0310
前端·javascript·学习
17(无规则自律)18 小时前
C++ 链表修炼指南
数据结构·c++·算法·leetcode·链表
KhalilRuan18 小时前
基于OpenGL实现布料模拟
算法
大江东去浪淘尽千古风流人物18 小时前
【claw】 OpenClaw 的架构设计探索
深度学习·算法·3d·机器人·slam
闻缺陷则喜何志丹18 小时前
【字典树 回溯】P7210 [COCI 2020/2021 #3] Vlak|普及+
c++·算法·字典树·回溯·洛谷
夏玉林的学习之路18 小时前
委托构造和using关键字
开发语言·c++·算法
·中年程序渣·18 小时前
Spring AI Alibaba入门学习(三)
java·学习·spring
small-pudding18 小时前
深入理解PDF:蒙特卡洛光线追踪中的概率密度函数
算法·pdf·图形渲染
We་ct18 小时前
LeetCode 46. 全排列:深度解析+代码拆解
前端·数据结构·算法·leetcode·typescript·深度优先·回溯
逆境不可逃18 小时前
LeetCode 热题 100 之 763.划分字母区间
算法·leetcode·职场和发展