Qt实现简单计算器

这篇具有很好参考价值的文章主要介绍了Qt实现简单计算器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

三级项目想用Qt做界面。
为了熟悉一下Qt操作,历时8h做了个计算器。
没用到数据库,布的控件也比较简单。
所以calculator.pro和widget.ui就不放了(太长了占地方)
文件压缩包放在下一篇了,需要自取。
自学时间较短,有很多不足欢迎指正。

⭐:del按键上的图片用的是绝对路径,运行的话要自己改一下。


一、项目文件总览

Qt实现简单计算器

二、源码

1.widget.h

代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QStack>
#include <string.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_oneButton_clicked();

    void on_twoButton_clicked();

    void on_threeButton_clicked();

    void on_fourButton_clicked();

    void on_fiveButton_clicked();

    void on_sixButton_clicked();

    void on_sevenButton_clicked();

    void on_eightButton_clicked();

    void on_nineButton_clicked();

    void on_zeroButton_clicked();

    void on_rightButton_clicked();

    void on_clearButton_clicked();

    void on_delButton_clicked();

    void on_equalButton_clicked();

    void on_leftButton_clicked();

private:
    Ui::Widget *ui;
    QString expression;//定义字符串接收计算式
    int Priority(char ch);

};
#endif // WIDGET_H

2.main.cpp

代码如下(示例):文章来源地址https://www.toymoban.com/news/detail-510931.html

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

3.widget.cpp

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

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

    //删除按钮上放图片
    QIcon con("C:\\Users\\apple\\Desktop\\QtProject\\QtOnline\\calculator\\del.PNG");
    ui->delButton->setIcon(con);


     //连接信号与槽  四个参数分别是:谁发出信号 发出什么信号 谁处理信号 怎么处理信号
    //若槽函数处理的信息量小 可采用内联格式书写
    connect(ui->addButton,&QPushButton::clicked,[this]()//点击加号
    {
        expression += "+";  //字符串末尾添加一个字符“+”
        ui->outputLineEdit->setText(expression);        //在输出框中显示算式字符串
    });
    connect(ui->subButton,&QPushButton::clicked,[this]()//点击减号
    {
        expression += "-";
        ui->outputLineEdit->setText(expression);
    });
    connect(ui->mulButton,&QPushButton::clicked,[this]()//点击乘号
    {
        expression += "*";
        ui->outputLineEdit->setText(expression);
    });
    connect(ui->divButton,&QPushButton::clicked,[this]()//点击除号
    {
        expression += "/";
        ui->outputLineEdit->setText(expression);
    });

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

Widget::~Widget()       //析构函数
{
    delete ui;
}


void Widget::on_oneButton_clicked()//点击1
{
    expression += "1";
    ui->outputLineEdit->setText(expression);

}

void Widget::on_twoButton_clicked()//点击2
{
    expression += "2";
    ui->outputLineEdit->setText(expression);

}

void Widget::on_threeButton_clicked()//点击3
{
    expression += "3";
    ui->outputLineEdit->setText(expression);
}


void Widget::on_fourButton_clicked()//点击4
{
    expression += "4";
    ui->outputLineEdit->setText(expression);
}


void Widget::on_fiveButton_clicked()//点击5
{
    expression += "5";
    ui->outputLineEdit->setText(expression);
}


void Widget::on_sixButton_clicked()//点击6
{
    expression += "6";
    ui->outputLineEdit->setText(expression);
}


void Widget::on_sevenButton_clicked()//点击7
{
    expression += "7";
    ui->outputLineEdit->setText(expression);
}


void Widget::on_eightButton_clicked()//点击8
{
    expression += "8";
    ui->outputLineEdit->setText(expression);
}

void Widget::on_nineButton_clicked()//点击9
{
    expression += "9";
    ui->outputLineEdit->setText(expression);
}


void Widget::on_zeroButton_clicked()//点击0
{
    expression += "0";
    ui->outputLineEdit->setText(expression);
}
void Widget::on_leftButton_clicked()//点击左括号
{
    expression += "(";
    ui->outputLineEdit->setText(expression);
}
void Widget::on_rightButton_clicked()//点击右括号
{
    expression += ")";
    ui->outputLineEdit->setText(expression);
}

void Widget::on_clearButton_clicked()//清空显示框
{
    expression.clear();     //字符串清空函数
    ui->outputLineEdit->clear();        //清空运行框内容
}

void Widget::on_delButton_clicked()//点击删除按键
{
    expression.chop(1);         //将字符串最后的一个元素删除
    ui->outputLineEdit->setText(expression);
}


int Widget::Priority(char ch)       //定义运算符优先级  右括号不入栈版
{
    switch (ch)
    {
            case'+':
            case'-':
                return 1;
            case'*':
            case'/':
                return 2;
            case'(':
                return 3;
            default:
                return 0;
    }
}

void Widget::on_equalButton_clicked()       //点击等号时
{
    QStack<int> s_num,s_opt;        //开两个int型栈  数值栈s_num  符号栈s_opt

    char opt[128] = {0};
    int i = 0 , tmp = 0 , num1 , num2;          //遍历指针i  操作数num1  操作数num2


    //把QString转换成char *
    QByteArray ba;
    ba = expression.toUtf8();       //把QString转换成QByteArray
   // ba.append(expression);
    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';      //将多个char型数组元素转成一个int型数据
             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);     //注意减数与被减数顺序 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->outputLineEdit->setText(QString::number(s_num.top()));
}




到了这里,关于Qt实现简单计算器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt编写简单计算器

    一、使用LCD Number、Push Button和GridLayout编辑计算器页面。  二、代码 widget.h main.cpp widget.cpp

    2024年02月12日
    浏览(40)
  • Android 实战项目:简单计算器

    虽然只学了一些Android的简单控件,但是只要活学善用这些布局和控件,也能够做出实用的App。 接下来让我们尝试设计并实现一个简单计算器。 Windows计算器,它主要由上半部分的计算结果与下半部分的计算按钮两块区域组成,据此可创建一个界面相似的计算器App,同样由计算

    2024年02月03日
    浏览(52)
  • 【简单】使用ChatGPT和QT从零开始构建一个计算器应用

    在这篇博文中,我将向大家展示如何使用ChatGPT和Qt来构建一个完整的计算器应用。我们将从零开始,逐步引导您完成整个项目,包括需求分析、软件设计、代码编写等环节。该项目代码全部由GPT编写,10分钟完成。 本项目旨在使用ChatGPT和Qt技术构建一个功能完备的计算器应用。

    2024年02月11日
    浏览(69)
  • 【Python】简单计算器实现(四)

    解决思路: 最后,我们来看看最简单的运算函数和判断运算符函数。 定义函数: def calculate(n1, n2, operator) param n1: float param n2: float param operator: + - * / return: float 定义函数: def is_operator(e) param e: str return: bool 最后的调用 这里定义了两个变量 result 和 _ 来接收 final_calc 返回的两个

    2024年02月16日
    浏览(41)
  • 模拟实现一个简单的计算器

    2024年02月11日
    浏览(53)
  • 用代码实现一个简单计算器

    作者主页: paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者: 大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于 《C语言》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将C语言基础知识一网打尽,希望可

    2024年02月08日
    浏览(43)
  • 使用Vue三种方法实现简单计算器

    代码实现了一个简单的计算器,用户可以在输入框中输入两个数字,选择一个操作符,并点击“等于”按钮,Vue.js会根据用户的输入进行计算,并将结果显示在另一个输入框中。 以下是效果图 第一种:使用methods方法实现 1:首先,引入Vue.js库。在代码中使用了script 标签引入

    2024年02月08日
    浏览(48)
  • HTML和JavaScript实现一个简单的计算器

    使用HTML和JavaScript实现一个简单的计算器。 这段代码会在浏览器中创建一个标题为\\\"Simple Calculator\\\"的页面。页面顶部有一个 h1 元素,用于显示标题。计算器界面使用了CSS网格布局,将按钮排列为4列。 在JavaScript部分,定义了一些函数来处理计算器的操作。 appendCharacter() 函数用

    2024年02月13日
    浏览(51)
  • Java实现简单计算器(GUI)页面(适合入门)

    使用Java Swing的GUI图形用户界面编程设计并编写一个简易计算器程序,用户通过鼠标或者键盘操作输入参加运算的数值和运算符,要求能进行简单的四则运算。

    2024年02月12日
    浏览(56)
  • 51单片机简单计算器实现(100行)附源码

     不引流,项目最后附上本项目百行源码!! 如果对你有帮助不妨点个赞! 本项目使用: 51单片机 , 矩阵键盘 , 四位数码管 使用LCD显示的思路相差不大,由于是仿真,包容性比较强,所以还有很大优化空间         实际上有一定编程基础的同学借助代码里的注释应该

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包