代码复现|QT快速入门 (课程来自B站)--其二

QT快速入门 | 最简单最简洁的QT入门教程 | 嵌入式UI

二、四则运算计算器部分

calculator/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();

    int Priority(char ch);  //定义优先级成员函数
private slots:
    void on_oneBt_clicked();
    void on_twoBt_clicked();
//之后的槽函数为直接复制或自己练习右击槽函数
    void on_threeBt_clicked();

    void on_fourBt_clicked();

    void on_fiveBt_clicked();

    void on_sixBt_clicked();

    void on_sevenBt_clicked();

    void on_eightBt_clicked();

    void on_nineBt_clicked();

    void on_zeroBt_clicked();

    void on_addBt_clicked();
    void on_subBt_clicked();
    void on_mulBt_clicked();
    void on_divBt_clicked();
    void on_leftBt_clicked();
    void on_rightBt_clicked();

    void on_clearBt_clicked();

    void on_deleteBt_clicked();

    void on_equalBt_clicked();

private:
    Ui::Widget *ui;
    QString expression;  //私有的成员变量来记表达式
};
#endif // WIDGET_H

calculator/widget.cpp

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setMinimumSize(300,300);  //设置窗口大小的最小值,
    this->setMaximumSize(380,390);  //修改窗口大小,设置最大值,this代表当前类
    /*显示的是最小值,另一个为可调整的值 */

    this->setWindowTitle("计算器");  //设置窗口名字

    QFont f("simHei",14);  //构造一个QFont对象,帮助手册可以查到,&family为字体名称
    ui->mainLineEdit->setFont(f);  //设置窗口内字体,setfont函数内需要一个QFont对象

    //按钮上面放图片,以对象方式存在
    QIcon con("D:\\QT\\Qtproject\\QtOnline\\calculator\\删除箭头.png");
    ui->deleteBt->setIcon(con);

    //改变按钮背景色
    ui->equalBt->setStyleSheet("background:rgba(127,127,127,127)");
}

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


void Widget::on_oneBt_clicked()
{
    expression += "1";  //点击1后将表达式加上1
    ui->mainLineEdit->setText(expression);  //将1显示出来
}

/*此部分函数为直接书写,没有在ui界面右击转到槽,运行正常。注:对应的头文件也要写好*/
void Widget::on_twoBt_clicked()
{
    expression += "2";
    ui->mainLineEdit->setText(expression);
}

/* 其余部分为直接复制 */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

//清空输出的内容
void Widget::on_clearBt_clicked()
{
    expression.clear();
    ui->mainLineEdit->clear();
}



void Widget::on_deleteBt_clicked()
{
    expression.chop(1);//从string最后删掉1个字符,可以在索引中找到chop的描述 QString chop()
    ui->mainLineEdit->setText(expression);
}

void Widget::on_equalBt_clicked()
{
    QStack<int> s_num,s_opt;  //QStack是一个模板类,指定类型保存

    //创建对象时会调用构造函数进行初始化
    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(num1-num2);  //进栈
                        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(num1/num2);  //进栈
                        break;
                }
            }
        }

    }
    //最后留在栈里的就是结果,将结果显示
    ui->mainLineEdit->setText(QString::number(s_num.top()));  //QString中有个静态成员函数number(),可以把数字转换成字符串。
    expression.clear();
}

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





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值