QT入门(四)——计算器实现

本文是QT入门系列的第四部分,主要展示了如何实现一个计算器。包括实现效果图、widget.h文件的内容、main.cpp的代码、widget.cpp的实现以及UI设计的详细步骤。读者可以参考源代码尝试自己动手创建一个计算器。
摘要由CSDN通过智能技术生成

目录

1.实现效果图展示:

 2.widget.h文件

3.main.cpp

4.widget.cpp文件

5.ui设计

1.实现效果图展示:

下面附有博主的源代码,感兴趣的可以试试自己实现一个计算器哦

 2.widget.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QStack>
#include<QProcess>
#include<QMessageBox>
#include<QIcon>
#include<QPalette>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_DivButton_clicked();

    void on_MulButton_clicked();

    void on_ClearButton_clicked();

    void on_oneButton_clicked();

    void on_twoButton_clicked();

    void on_threeButton_clicked();

    void on_SumButton_clicked();

    void on_fourButton_clicked();

    void on_fiveButton_clicked();

    void on_sixButton_clicked();

    void on_SubButton_clicked();

    void on_sevenButton_clicked();

    void on_eightButton_clicked();

    void on_nineButton_clicked();

    void on_EqualButton_clicked();

    void on_zeroButton_clicked();

    void on_DropButton_clicked();


    void on_LeftButton_clicked();

    void on_RightButton_clicked();
    int Priority(char ch);

private:
    Ui::Widget *ui;
    QString expression;
    char ch;

};

#endif // WIDGET_H

3.main.cpp

#include "widget.h"
#include <QApplication>

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

    return a.exec();
}

4.widget.cpp文件

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    setAutoFillBackground(true);
    ui->setupUi(this);
    this->setWindowTitle("计算器");
    QFont f("黑体",14); //字体对象
    ui->CmdlineEdit->setFont(f);
    //按钮上放图片
    QIcon con("G:/picture/12.webp");
    ui->DropButton->setIcon(con);
    ui->DropButton->setIconSize(QSize(50,50));
    ui->DivButton->setFlat(true);

    //改变按钮背景的颜色
    ui->DivButton->setStyleSheet("background:gold");
    ui->EqualButton->setStyleSheet("background:gold");
    ui->SubButton->setStyleSheet("background:gold");
    ui->MulButton->setStyleSheet("background:gold");
    ui->ClearButton->setStyleSheet("background:gold");
    ui->RightButton->setStyleSheet("background:gold");
    ui->LeftButton->setStyleSheet("background:gold");
    ui->zeroButton->setStyleSheet("background:gold");
    ui->oneButton->setStyleSheet("background:gold");
    ui->twoButton->setStyleSheet("background:gold");
    ui->threeButton->setStyleSheet("background:gold");
    ui->fourButton->setStyleSheet("background:gold");
    ui->SumButton->setStyleSheet("background:gold");
    ui->fiveButton->setStyleSheet("background:gold");
    ui->sixButton->setStyleSheet("background:gold");
    ui->sevenButton->setStyleSheet("background:gold");
    ui->eightButton->setStyleSheet("background:gold");
    ui->nineButton->setStyleSheet("background:gold");


    QPalette palette;
    palette.setBrush(QPalette::Background,QBrush(QPixmap("G:\\picture\\calculate.webp")));
    setPalette(palette);
}

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

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

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

void Widget::on_ClearButton_clicked()
{
    expression.clear();
    ui->CmdlineEdit->clear();
}

void Widget::on_oneButton_clicked()
{
    expression += "1";
    ui->CmdlineEdit->setText(expression);
}

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

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

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

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

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

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

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

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

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

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

void Widget::on_DropButton_clicked()
{
    expression.chop(1);
    ui->CmdlineEdit->setText(expression);
}


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



//优先级判断
int Widget::Priority(char ch)
{
    switch (ch)
    {
    case '(':
        return 3;
    case '*':
    case '/':
        return 2;
    case '+':
    case '-':
        return 1;
    default:
        return 0;
    }
}
void Widget::on_LeftButton_clicked()
{
    expression += "(";
    ui->CmdlineEdit->setText(expression);
}


void Widget::on_RightButton_clicked()
{
    expression += ")";
    ui->CmdlineEdit->setText(expression);
}
void Widget::on_EqualButton_clicked()
{

    //计算器

        QStack<int> s_num,s_opt;
        //将Qstring转成char*
        QByteArray ba;
        ba.append(expression);
        char opt[128] = {0};
        strcpy(opt,ba.data());

        int i = 0,tmp = 0,num1,num2;
        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;
                    default:
                        break;
                    }
                }
            }
        }
        ui->CmdlineEdit->setText(QString::number(s_num.top()));
        expression.clear();

}




5.ui设计

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李 同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值