Qt 项目:windows计算器

项目描述

实现Windows计算器
在这里插入图片描述

QT 实现windows计算器

功能:

  1. 计算一个表达式,将它存储在右边历史记录框中
  2. 求一个数的二进制
  3. 求一个数的平方
  4. 退格键
  5. 清空历史记录和表达式框
  6. 将第一个数变成负数

先导知识

1. 如何实现多个按钮绑定一个槽函数?

按键0-9实现的功能都是一样,设置基本的运算符 + - * / 几乎都差不多的功能,所以我们可以将它直接绑定到一个槽函数。

connect

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->btn1,&QPushButton::clicked,this,&Widget::cal_textBox);  //按钮1连接
    connect(ui->btn2,&QPushButton::clicked,this,&Widget::cal_textBox);  //按钮2连接
    /*****************************************************
    *参数:
    *	发送对象(按钮)	信号(单击事件)	接收方(widget)	槽函数
    ******************************************************/
}

void Widget::cal_textBox(){
    //senderObj 可以获取到发送者的名字
    QString senderObj = this->sender()->objectName();
    //qDebug()<<senderObj;
    QString textbox = ui->textEdit->toPlainText();
    if(senderObj=="btn1"){
        textbox.append("1");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn2"){
        textbox.append("2");
        ui->textEdit->setPlainText(textbox);
    }
}

2.QString 常用函数

//转换成整型
QString ep1 = "123";
int res = ep1.toInt();	//123

//QChar 与 QString
	char op;
	for(QChar c:exp){	//增强for语句  QString 会把单个字符变成QChar类型
           if(c=='+' || c=='-' || c=='*' || c=='/')
               op = c.toLatin1();	//QChar 转换成char类型
      }

//查找字符
QString exp = "123+456"
//op='+' 从下标为1处开始找 op,返回一个下标,找不到返回-1
int op_pos = exp.indexOf(op,1);	

//字符串分割  截取
	QString ep1;
    ep1 = exp.left(op_pos);	//截取op_pos个字符 就是截取到+之前
    QString ep2;
    ep2 = exp.mid(op_pos+1);

//删除str最后一个字符
    QString str = "15*16";
    str.chop(1);	//15*1
	str = "-156";
	//删除第0位 删1个字符
	str.remove(0,1);	//str = 156	

//将整数转换成二进制或者10进制字符串
	int res = ep2.toInt();	//res = 10
	// %1表示1个值	res就是值  1:一个字节  2:二进制(10就是十进制)	
    QString r = QString("%1").arg(res, 1, 2);	//r=1010
//在textbox末尾添加1
QString textbox;
textbox.append("1");

操作ui对象的一些方法

//获取textEdit的文本信息
QString textbox = ui->textEdit->toPlainText();	
//设置textEdit的文本信息
ui->textEdit->setPlainText(textbox);
//textbox="12+1" r=13 添加信息到showbox的下一行
 ui->showbox->append(textbox+"="+r);

//清空信息框的东西
ui->showbox->clear();

ui界面

在这里插入图片描述

每个按钮的名字都要改哦

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QString>
#include <QTextCursor>
#include <QChar>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

    //定义文本框的槽函数,会有多个信号连接进来
    void cal_textBox();
    //计算表达式结果
    int cal_res(QString);

private slots:
    void on_clear_clicked();

    void on_del_clicked();

    void on_sqr_clicked();

    void on_bin_clicked();

    void on_changesigned_clicked();

    void on_clearmemory_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp(重点)

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

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->btn0,&QPushButton::clicked,this,&Widget::cal_textBox);
    connect(ui->btn1,&QPushButton::clicked,this,&Widget::cal_textBox);  //按钮1连接
    connect(ui->btn2,&QPushButton::clicked,this,&Widget::cal_textBox);  //按钮2连接
    connect(ui->btn3,&QPushButton::clicked,this,&Widget::cal_textBox);
    connect(ui->btn4,&QPushButton::clicked,this,&Widget::cal_textBox);
    connect(ui->btn5,&QPushButton::clicked,this,&Widget::cal_textBox);
    connect(ui->btn6,&QPushButton::clicked,this,&Widget::cal_textBox);
    connect(ui->btn7,&QPushButton::clicked,this,&Widget::cal_textBox);
    connect(ui->btn8,&QPushButton::clicked,this,&Widget::cal_textBox);
    connect(ui->btn9,&QPushButton::clicked,this,&Widget::cal_textBox);
    connect(ui->btnplus,&QPushButton::clicked,this,&Widget::cal_textBox);   //+
    connect(ui->btnsub,&QPushButton::clicked,this,&Widget::cal_textBox);   //-
    connect(ui->btnmul,&QPushButton::clicked,this,&Widget::cal_textBox);   //*
    connect(ui->btndiv,&QPushButton::clicked,this,&Widget::cal_textBox);   //÷
    connect(ui->equal,&QPushButton::clicked,this,&Widget::cal_textBox);     //=
}

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

void Widget::cal_textBox(){
    //senderObj 可以获取到发送者的名字
    QString senderObj = this->sender()->objectName();
    //qDebug()<<senderObj;
    QString textbox = ui->textEdit->toPlainText();
    //定义一个已有操作符
    static bool have_op = false;

    if(senderObj=="btn1"){
        textbox.append("1");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn2"){
        textbox.append("2");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn0"){
        textbox.append("0");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn3"){
        textbox.append("3");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn4"){
        textbox.append("4");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn5"){
        textbox.append("5");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn6"){
        textbox.append("6");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn7"){
        textbox.append("7");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn8"){
        textbox.append("8");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btn9"){
        textbox.append("9");
        ui->textEdit->setPlainText(textbox);
    }
    else if(senderObj=="btnplus"){  //+
        if(textbox.isEmpty()) textbox.append("0");
        if(have_op){
            int res = cal_res(textbox);
            QString r = QString("%1").arg(res, 1, 10);
            ui->textEdit->setPlainText(r);
            ui->showbox->append(textbox+"="+r);
            have_op = false;
        }
        else{
            textbox.append("+");
            ui->textEdit->setPlainText(textbox);
            have_op = true;
        }
    }
    else if(senderObj=="btnsub"){  // -
        if(textbox.isEmpty()) textbox.append("0");
        if(have_op){
            int res = cal_res(textbox);
            QString r = QString("%1").arg(res, 1, 10);
            ui->textEdit->setPlainText(r);
            ui->showbox->append(textbox+"="+r);
            have_op = false;
        }
        else{
            textbox.append("-");
            ui->textEdit->setPlainText(textbox);
            have_op = true;
        }
    }
    else if(senderObj=="btnmul"){  // *
        if(textbox.isEmpty()) textbox.append("0");
        if(have_op){
            int res = cal_res(textbox);
            QString r = QString("%1").arg(res, 1, 10);
            ui->textEdit->setPlainText(r);
            ui->showbox->append(textbox+"="+r);
            have_op = false;
        }
        else{
            textbox.append("*");
            ui->textEdit->setPlainText(textbox);
            have_op = true;
        }
    }
    else if(senderObj=="btndiv"){  // ÷
        if(textbox.isEmpty()) textbox.append("0");
        if(have_op){
            int res = cal_res(textbox);
            if(res == -65530){
                 ui->textEdit->setPlainText("除数不能为0");
            }
            QString r = QString("%1").arg(res, 1, 10);
            ui->textEdit->setPlainText(r);
            ui->showbox->append(textbox+"="+r);
            have_op = false;
        }
        else{
            textbox.append("/");
            ui->textEdit->setPlainText(textbox);
            have_op = true;
        }
    }
    else if(senderObj=="equal"){
        QString exp = ui->textEdit->toPlainText();
        int res = cal_res(exp);
        QString r = QString("%1").arg(res, 1, 10);
        ui->textEdit->setPlainText(r);
        ui->showbox->append(textbox+"="+r);
        have_op = false;
    }

}

void Widget::on_clear_clicked()
{
    ui->textEdit->setPlainText("");
}
int Widget::cal_res(QString exp){
    char op;
    int op_pos; //操作符位置
    //qDebug()<<"exp[0]="<<exp[0];
     for(QChar c:exp){
           //qDebug()<<"c="<<c;
           if(c=='+' || c=='-' || c=='*' || c=='/')
               op = c.toLatin1();
      }
    op_pos = exp.indexOf(op,1);
    //qDebug()<<"op_pos: "<<op_pos;
    int res = 0;
    QString ep1;
    ep1 = exp.left(op_pos);
    QString ep2;
    ep2 = exp.mid(op_pos+1);
    //qDebug()<<"ep1="<<ep1<<"ep2="<<ep2;
    switch(op){
        case '+':
            res = ep1.toInt() + ep2.toInt();
            break;
        break;
    case '-':
        res = ep1.toInt() - ep2.toInt();
        break;
    case '*':
        res = ep1.toInt() * ep2.toInt();
        break;
    case '/':
        if(ep2.toInt()==0){
            return -65530;
        }
        res = ep1.toInt() / ep2.toInt();
        break;
        default:
            qDebug()<<"exp error";break;
    }
    //qDebug()<<"res="<<res;
    return res;
}

void Widget::on_del_clicked()
{
    //删除textedit最后一个字符
    QString str = ui->textEdit->toPlainText();
    str.chop(1);
    //qDebug()<<str;
    ui->textEdit->setPlainText(str);
}

void Widget::on_sqr_clicked()
{
    QString str = ui->textEdit->toPlainText();
    char op;
     for(QChar c:str){
            if(c=='+' || c=='-' || c=='*' || c=='/')
                op = c.toLatin1();
      }
    int op_pos = str.indexOf(op,1);
    QString ep2;
    ep2 = str.mid(op_pos+1);
    int res = ep2.toInt() * ep2.toInt();
    QString r = QString("%1").arg(res, 1, 10);  //123+456  str.chop(str.length()-op_pos);
    str.chop(str.length()-op_pos);
    //qDebug()<<"del str="<<str;
    ui->textEdit->setPlainText(str+r);
    ui->showbox->append("sqr("+ep2+")="+r);
}

void Widget::on_clearmemory_clicked()
{
    //清空信息框的东西
    ui->showbox->clear();
    ui->showbox->append("show info:");
}

void Widget::on_bin_clicked()
{
    //求二进制
    QString str = ui->textEdit->toPlainText();
    char op;

     for(QChar c:str){
            if(c=='+' || c=='-' || c=='*' || c=='/')
                op = c.toLatin1();
      }
    int op_pos = str.indexOf(op,1);
    QString ep2;
    ep2 = str.mid(op_pos+1);
    int res = ep2.toInt();
    QString r = QString("%1").arg(res, 1, 2);
    ui->showbox->append("bin("+ep2+")="+r);
}

void Widget::on_changesigned_clicked()
{
    //改变第一个数字符号
    QString str = ui->textEdit->toPlainText();
    if(str.at(0) != '-'){
        str.insert(0,"-");
    }
    else{
        str.remove(0,1);
    }
    ui->textEdit->setPlainText(str);
}

效果展示

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值