Qt小项目1 计算器

 头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QGridLayout>
#include <QDebug>
#include <QString>
#include <QStringList>
#include <QFont>

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void number_clicked();
    void expr_clicked();
    void point_clicked();
    void chop_clicked();
    void clear_clicked();
    void equal_clicked();

private:
    QLineEdit *le;
    QPushButton *pb[18];
    double num1,num2,num;//结果,左值,右值
    char expr;
};

#endif // WIDGET_H

cpp文件:

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QFont font ("Times", 30, QFont::Bold);//设置字体
    this->setFont(font);    //应用到全部

    le=new QLineEdit("0");
    le->setAlignment(Qt::AlignRight);//设置行编辑器为右对齐

    QStringList list ={"0","1","2","3","4","5","6","7","8",\
                       "9",".","/","*","-","+","<-","C","="};

    for(int i=0;i<18;i++)
    {
        pb[i]= new QPushButton(list.at((i)));//初始化按钮,at表示取字符串的第几个参数
    }

    pb[17]->setFixedHeight(130);//设置等号按钮的高度
    QFont font1 ("Times", 50, QFont::Bold);//设置字体
    pb[17]->setFont(font1); //应用到等号


    QGridLayout *gbox = new QGridLayout;
    gbox->addWidget(le,0,0,1,5);

    gbox->addWidget(pb[7],1,0,1,1);
    gbox->addWidget(pb[8],1,1,1,1);
    gbox->addWidget(pb[9],1,2,1,1);
    gbox->addWidget(pb[11],1,3,1,1);// /
    gbox->addWidget(pb[15],1,4,1,1);//<-

    gbox->addWidget(pb[4],2,0,1,1);
    gbox->addWidget(pb[5],2,1,1,1);
    gbox->addWidget(pb[6],2,2,1,1);
    gbox->addWidget(pb[12],2,3,1,1);// *
    gbox->addWidget(pb[16],2,4,1,1);//C

    gbox->addWidget(pb[1],3,0,1,1);
    gbox->addWidget(pb[2],3,1,1,1);
    gbox->addWidget(pb[3],3,2,1,1);
    gbox->addWidget(pb[13],3,3,1,1);// -
    gbox->addWidget(pb[17],3,4,2,1);//=

    gbox->addWidget(pb[0],4,0,1,2);
    gbox->addWidget(pb[10],4,2,1,1);//.
    gbox->addWidget(pb[14],4,3,1,1);//+
    setLayout(gbox);

    for(int i=0;i<10;i++)//数子
    {
        connect(pb[i],SIGNAL(clicked(bool)),this,SLOT(number_clicked()));
    }

    for(int i=11;i<15;i++) //运算符
    {
        connect(pb[i],SIGNAL(clicked(bool)),this,SLOT(expr_clicked()));
    }

    connect(pb[10],SIGNAL(clicked(bool)),this,SLOT(point_clicked()));//.
    connect(pb[15],SIGNAL(clicked(bool)),this,SLOT(chop_clicked()));//<-
    connect(pb[16],SIGNAL(clicked(bool)),this,SLOT(clear_clicked()));//C
    connect(pb[17],SIGNAL(clicked(bool)),this,SLOT(equal_clicked()));//=
    num=num1=num2=0;
    expr='#';
}

Widget::~Widget()
{

}

void Widget::number_clicked()
{
    //sender()通过谁产生信号进入的槽函数
    //通过强制类型转换,转换成对应的派生类对象
    QPushButton *pbb = static_cast<QPushButton *> (sender());//谁产生的信号
    //dynamic_cast
    //int n = pdd->text().toInt();//获取按钮上的文字并转换成整数
    QString str1 = pbb->text();
    QString str =le->text();
    if("0"==str)    //避免出现01,这种0开头的数字
    {
        le->setText(str1);
    }
    else
            le->setText(str+str1);
}

void Widget::expr_clicked()
{
    if('#'!=expr)//避免连续点击多次运算符
        return;
    QPushButton *pbb = static_cast<QPushButton *> (sender());
    QString str = pbb->text();
    expr=str.at(0).toLatin1();//把字符串去第一个字符Qchar,再转换成char类型
    num1=le->text().toDouble();//保存左值
    le->setText("0");   //此时可以输入第二个数字

}

void Widget::point_clicked()
{
    QString str=le->text();
    if(-1!=str.indexOf('.'))//查找字符的位置,找不到返回-1
           return ;
    le->setText(str+'.');//如果没有. ,加上点在运行
}

void Widget::chop_clicked()//删除一个
{
    QString str=le->text();
    if(1==str.length()) //只有一个数字时,删除完要显示0
        le->setText("0");
    else
    {
        str.chop(1);//去掉字符串最后一个元素
        le->setText(str);
    }
}

void Widget::clear_clicked()
{
    expr='#';
    num=num1=num2=0;
    le->setText("0");
}

void Widget::equal_clicked()
{
    if('#'==expr)//避免连续点击
        return;
    num2 = le->text().toDouble();
    switch(expr)
    {
        case '+':
            num=num1+num2;
            break;
        case '-':
            num=num1-num2;
            break;
        case '*':
            num=num1*num2;
            break;
        case '/':
            if(0==num2)
            {
               clear_clicked();
               return;
            }
            num=num1/num2;
            break;
    }
    le->setText(QString::number(num));
    expr='#';
    num=num1=num2=0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值