QT+简易计算器小项目

     计算器qt小项目,简单。
     这几天准备学习下QT,都说QT比MFC容易上手很多,所以刚装好QT5.9.8,上网查资料编写了一个简单的计算器小项目,在这里留下编写过程,算是刚接触QT的一点心得吧,通过此小项目发现QT确实比MFC好用,编程过程会实时提示你的编程错误,软件启动和运行速度都很快,最重要的界面布局和信号连接比较方便。计算器效果如下:
     ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190628133029850.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTkxMjk1,size_16,color_FFFFFF,t_70)

编写过程大致按如下步骤,首先第一步,在QTCreator中新建一个Qt widgets Application , 在基类选择页面选QWidget,其他都选择默认即可。
在这里插入图片描述
第二步,需求分析:需要十八个按键(push button),分别为0 1 2 3 4 5 6 7 8 9 . + - * / C 退格 ,来输入需要的数据和需要进行的操作,还需要一个显示框(Line edit)来显示结果,布局如第一幅图所示,可更具个人喜好更改颜色布局等。设置对应控件 的objectname和Text,如下表所示:
在这里插入图片描述
第三步:编程分析用到的函数有
1连接函数:例connect(ui->pushButton0,SIGNAL(clicked(bool)),this,SLOT(item0()));表示将按键0与item()函数连接起来。
2获取按键的text的函数:例item_0 = ui->pushButton0->text();表示将按键0的text存储在字符串item_0中。
3字符显示函数:例ui->lineEdit->setText(line); //表示将字符串line显示在显示框lineEdit中
过程大致就是
我们定义10个字符串来存储对应按键输入的数字,如下:
QString item_0; //0
QString item_1; //1
QString item_2; //2
QString item_3;//3
QString item_4;//4
QString item_5;//5
QString item_6;//6
QString item_7;//7
QString item_8;//8
QString item_9;
然后定义两个存放需要进行加减等操作的字符串,用来存储需要进行运算的两个数的字符串值
QString temp1,temp2;
然后定义浮点型变量,用来存储最后的输出结果
double sum = 0;
再定义7个整形变量,作为不同状态的标志符,如下:
int flag = 0 ;//flag加号标志,
int flag1 = 0; flag1等于号标志
int flag3 = 0;//减号标志
int flag4 = 0;//乘号标志
int flag5 = 0;//除号标志
int flag6 = 0; //下一次运算开始标志
最后定义字符串line,用于实时显示当前输入或者计算结果
QString line;
下面我们以计算66*88=5808看一下具体的运算过程
首先按6,则按键6对应的槽函数item6()会将按键6的text值6赋给字符串item_6 ,然后将item6的值赋给需要显示的字符串line,当再按一次6时,同样将按键6的text值6赋给字符串item_6,并将item_6的值串接在字符串line的后面,此时line值为“66”。
然后按下乘号键,此时乘号键的槽函数mul()首先将乘号运算标志flag5置为1,即flag5=1;然后将line中已有的需要运算的第一个数存在字符串temp1中,并将乘号“”的字符串值串接在line中显示,此时line值为66
然后同理按下88,按键8的槽函数item6()按与按键6的槽函数相同规则进行处理,此时显示字符串line的值变为6688
再按下等号键=,等号键的槽函数equal() 首先将=串接在line中,此时line的值为66
88=,然后查看标识符,看是什么运算,查到flag5=1,断定是运算。再检测字符串line中 * 和=之间的字符,检测到为88,并将检测结果赋给第二个存储运算变量的字符串temp2, 此时temp2的值应为“88”。
然后将temp1和temp2中的数转换成浮点型,并执行标志flag5对应的乘运算,将结果赋给浮点型变量num,此时num值为5808。执行语句为 sum = temp1.toDouble() + temp2.toDouble(); //将字符转换成浮点型
最后将num的值转为字符串,并串接在line后面显示,此时line的值为“66
88=5808”,执行语句为 line=line+QString::number(sum); ui->lineEdit->setText(line);
最最后,将一次运算完成标志flag6置为1,之后按0~9之间的任何数时,会将其当做一次重新的计算,并把line,temp1,temp2中的值都清空。
以上就是一次完整的运算过程,其他运算与此类似。
第四步:具体实现过程
**一:**首先在widget.h头文件中的private slots下加入你的十八个按键对应的草函数名称,如下:

  void item0();//0
  void item1();//1
  void item2();//2
  void item3();//3
  void item4();//4
  void item5();//5
  void item6();//6
  void item7();//7
  void item8();//8
  void item9();//9
  void sub();//减号
  void div();//除号
  void mul();//乘号
  void cancel();//取消
  void delet();//尾剔除
  void add();//加号
  void equal();//等于号
  void point();//小数点

二:然后在widget.cpp中的
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
这里加…
}
加入每个按键信号和对应的槽函数连接的连接函数,检测到click(bool)信号时执行对应的槽函数,加入内容如下:

connect(ui->pushButton0,SIGNAL(clicked(bool)),this,SLOT(item0())); //0
connect(ui->pushButton1,SIGNAL(clicked(bool)),this,SLOT(item1())); //1
connect(ui->pushButton2,SIGNAL(clicked(bool)),this,SLOT(item2())); //2
connect(ui->pushButton3,SIGNAL(clicked(bool)),this,SLOT(item3())); //3
connect(ui->pushButton4,SIGNAL(clicked(bool)),this,SLOT(item4())); //4
connect(ui->pushButton5,SIGNAL(clicked(bool)),this,SLOT(item5())); //5
connect(ui->pushButton6,SIGNAL(clicked(bool)),this,SLOT(item6())); //6
connect(ui->pushButton7,SIGNAL(clicked(bool)),this,SLOT(item7())); //7
connect(ui->pushButton8,SIGNAL(clicked(bool)),this,SLOT(item8())); //8
connect(ui->pushButton9,SIGNAL(clicked(bool)),this,SLOT(item9())); //9
connect(ui->pushButton_c,SIGNAL(clicked(bool)),this,SLOT(cancel()));//取消
connect(ui->pushButton_add,SIGNAL(clicked(bool)),this,SLOT(add()));//加号
connect(ui->pushButton_equal,SIGNAL(clicked(bool)),this,SLOT(equal()));//等于号
connect(ui->pushButton_point,SIGNAL(clicked(bool)),this,SLOT(point()));//小数点
connect(ui->pushButton_div,SIGNAL(clicked(bool)),this,SLOT(div()));//除号
connect(ui->pushButton_sub,SIGNAL(clicked(bool)),this,SLOT(sub()));//减号
connect(ui->pushButton_mul,SIGNAL(clicked(bool)),this,SLOT(mul()));//乘号
connect(ui->pushButton_delete,SIGNAL(clicked(bool)),this,SLOT(delet()));//尾剔除

最后在刚才那个函数,即:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
已加入连接函数;
}的后面加入运算代码,如下:

QString line;
 QString item_0; //0
 QString item_1; //1
 QString item_2; //2
 QString item_3;//3
 QString item_4;//4
 QString item_5;//5
 QString item_6;//6
 QString item_7;//7
 QString item_8;//8
 QString item_9;//9
 QString temp1,temp2; //临时存放两次输入的要进行计算的项
 double sum = 0;  //计算后的结果
 int flag = 0,flag1 = 0; //flag加号标志,flag1等于号标志
 int flag3 = 0;//减号标志
 int flag4 = 0;//乘号标志
 int flag5 = 0;//除号标志
 int flag6 = 0; //下一次运算开始标志
 Widget::~Widget()
 {
      delete ui;
 }
 void Widget::item0() //0
 {
     if(flag6==1)
     {
         flag6=0;
         line.clear();
         temp1.clear();
         temp2.clear();
     }
    item_0 = ui->pushButton0->text(); //获取按键中的字符"0"
     line += item_0;//每按一次按键就相加一次按键中的字符"0"
     ui->lineEdit->setText(line); //显示到输入条中
 }
 void Widget::item1() //1
  {
     if(flag6==1)
     {
         flag6=0;
         line.clear();
         temp1.clear();
         temp2.clear();
     }
      item_1 = ui->pushButton1->text();
     line += item_1;
     ui->lineEdit->setText(line);
  }
 void Widget::item2() //2
  {
     if(flag6==1)
     {
         flag6=0;
         line.clear();
         temp1.clear();
         temp2.clear();
     }
     item_2 = ui->pushButton2->text(); //获取按键中的字符"2"
    line += item_2; //每按一次按键就相加一次按键中的字符"2"
    ui->lineEdit->setText(line);
 }
 void Widget::item3() //3
  {
     if(flag6==1)
     {
         flag6=0;
         line.clear();
         temp1.clear();
         temp2.clear();
     }
    item_3 = ui->pushButton3->text(); //获取按键中的字符"3"
    line += item_3; //每按一次按键就相加一次按键中的字符"3"
     ui->lineEdit->setText(line);
  }
 void Widget::item4() //4
  {
     if(flag6==1)
     {
         flag6=0;
         line.clear();
         temp1.clear();
         temp2.clear();
     }
      item_4 = ui->pushButton4->text();
      line += item_4;
      ui->lineEdit->setText(line);
  }
  void Widget::item5() //5
  {
      if(flag6==1)
      {
          flag6=0;
          line.clear();
          temp1.clear();
          temp2.clear();
      }
      item_5 = ui->pushButton5->text();
     line += item_5;
     ui->lineEdit->setText(line);
  }
 void Widget::item6() //6
 {
     if(flag6==1)
     {
         flag6=0;
         line.clear();
         temp1.clear();
         temp2.clear();
     }
     item_6 = ui->pushButton6->text();
    line += item_6;
    ui->lineEdit->setText(line);
}
 void Widget::item7() //7
 {
     if(flag6==1)
     {
         flag6=0;
         line.clear();
         temp1.clear();
         temp2.clear();
     }
     item_7 = ui->pushButton7->text();
    line += item_7;
    ui->lineEdit->setText(line);
 }
void Widget::item8() //8
 {
    if(flag6==1)
    {
        flag6=0;
        line.clear();
        temp1.clear();
        temp2.clear();
    }
     item_8 = ui->pushButton8->text();
     line += item_8;
     ui->lineEdit->setText(line);
 }
 void Widget::item9() //9
 {
     if(flag6==1)
     {
         flag6=0;
         line.clear();
         temp1.clear();
         temp2.clear();
     }
     item_9 = ui->pushButton9->text();
     line += item_9;
     ui->lineEdit->setText(line);
 }
 void Widget::point() //小数点
 {
    if(flag1 == 0) 
    {
        line +=".";
       ui->lineEdit->setText(line);
    }

     if(flag1 == 1) 
     {
        line  = ui->lineEdit->text();
        line += ".";
        ui->lineEdit->setText(line);
       flag1 = 0;
     }
}

 void Widget::delet() //尾剔除
 {
    line = ui->lineEdit->text(); //获取输入条中的字符
    line.chop(1); //倒位删除,即是从字符串后面开始按位删除
    ui->lineEdit->setText(line);
 }

void Widget::cancel() //重新置零
 {
    line.clear();
    temp1.clear();
    temp2.clear();
    sum = 0;
    flag = 0;
    flag1 = 0;
    flag3 = 0;
    flag4 =0;
    flag5 = 0;
    ui->lineEdit->setText(line);//输出0
 }
 void Widget::add() //相加
 {
     flag = 1;
     temp1 = ui->lineEdit->text(); //获取前面输入的字符并临时保存起来
     line=temp1+"+";
     ui->lineEdit->setText(line);
 }
void Widget::sub() //相减
 {
    flag3 = 1;//按了加号按键就改变状态
    temp1 = ui->lineEdit->text(); //获取前面输入的字符并临时保存起来
     line=temp1+"-";
    ui->lineEdit->setText(line);//显示清空状态
}
 void Widget::div()//除法
{
     flag4 = 1;//按了加号按键就改变状态
    temp1 = ui->lineEdit->text(); //获取前面输入的字符并临时保存起来
    line=temp1+"/";
     ui->lineEdit->setText(line);//显示清空状态
 }
void Widget::mul()//乘法
 {
     flag5 = 1;//按了加号按键就改变状态
     temp1 = ui->lineEdit->text(); //获取前面输入的字符临时保存起来
    line=temp1+"*";
     ui->lineEdit->setText(line);//显示清空状态
}
 void Widget::equal() //得出结果
 {
     flag1 = 1; //按一次等于号就改变状态
     if(flag == 1) //加法
    {
        // temp2 = ui->lineEdit->text();
        // line.clear(); //清空字符串
           line= line+"=";
           int b=100;
           temp2.clear();
         for(int a=0;a<line.size()-1;a++)
         {
             if(line[a]=="+")
             b=a;
             if(a>b)
               temp2+=line[a];
         }

      sum = temp1.toDouble() + temp2.toDouble(); //将字符转换成浮点型
          line=line+QString::number(sum);   
          ui->lineEdit->setText(line);
         flag = 0; //重新让标志位置零,等待下一次的加法进行
         flag6=1;
     }
     else if(flag3 == 1) //减法
    {
         line= line+"=";
         int b=100;
         for(int a=0;a<line.size()-1;a++)
         {
           if(line[a]=="-")
           b=a;
           if(a>b)
             temp2=temp2+line[a];
         }
       //  ui->lineEdit->setText(line);
      sum = temp1.toDouble() - temp2.toDouble(); //将字符转换成浮点型
         if(sum==0) //等于0
         {
             ui->lineEdit->setText("0");
         }
           line=line+QString::number(sum);
           ui->lineEdit->setText(line);
           flag3 = 0; //重新让标志位置零,等待下一次的减法进行
           flag6=1;
     }

     else if(flag4 == 1) //除法
     {
         line= line+"=";
         int b=100;
         for(int a=0;a<line.size()-1;a++)
         {
           if(line[a]=="/")
           b=a;
           if(a>b)
             temp2=temp2+line[a];
         }
      sum = temp1.toDouble() / temp2.toDouble(); //将字符转换成浮点型
         if(temp2 == "0") //分母等于0
         {
             ui->lineEdit->setText("0");
        }
         line=line+QString::number(sum);
         ui->lineEdit->setText(line);
         flag4 = 0; //重新让标志位置零,等待下一次的除法进行
         flag6=1;
    }
   else if(flag5 == 1) /`/`乘法
    {
         line= line+"=";
         int b=100;
         for(int a=0;a<line.size()-1;a++)
         {
           if(line[a]=="*")
           b=a;
           if(a>b)
             temp2=temp2+line[a];
         }
      sum = temp1.toDouble() * temp2.toDouble(); //将字符转换成浮点型
         line=line+QString::number(sum);
         ui->lineEdit->setText(line);
        flag5 = 0; //重新让标志位置零,等待下一次的乘法进行
        flag6=1;
     }
 }

总结:如果你开始时的按键和显示框的objectname和text按上面的表格设置正确,程序按如上三步添加正确,编译运行后简单计算器就可以运行了。
在这里插入图片描述
最后附上一张西安美图,以供欣赏。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值