使用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");
}

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

一下就是结果

相关推荐
仟濹4 分钟前
【算法 C/C++】二维前缀和
c语言·c++·算法
Chenyu_3109 分钟前
04.基于C++实现多线程TCP服务器与客户端通信
linux·服务器·网络·c++·tcp/ip·算法·visualstudio
晴空对晚照27 分钟前
[动手学习深度学习]12.权重衰退
人工智能·深度学习·学习
宇寒风暖34 分钟前
HTML嵌入CSS样式超详解(尊享)
前端·css·笔记·学习·html
mengzhi啊1 小时前
QTreeWidget的右键菜单,展开和折叠,或者其他操作
qt
十年编程老舅1 小时前
用Qt手搓AI助手,挑战24小时开发DeepSeek Assistant!
qt·计算机毕设·c++项目·qt项目·deepseek·计算机毕设项目
Dante7982 小时前
【数据结构】二叉搜索树、平衡搜索树、红黑树
数据结构·c++·算法
march of Time2 小时前
go注册rpc接口
qt·rpc·golang
驼驼学编程2 小时前
决策树,Laplace 剪枝与感知机
算法·决策树·剪枝
坚强小葵2 小时前
实验8-2-1 找最小的字符串
c语言·算法