QT创建计算器 [数据库实验课]

QT创建计算器 [数据库实验课]

前言

qt我没有系统的学习过,所以对很多细节都很不清楚,今天写这个计算器,遇到了好多问题。

问题

上课的时候老师做c#示例的时候,老师是在每一个0~9的按钮里,都双击添加函数的,然后我就想到当时写Java计算器的时候,是有一个函数,每个按钮都是在那个重写的函数里先判断id再进行的。我就思考如何在qt里面对同一组功能的btn实现像Java里那样的写法(对功能相似的按钮,这样写法更为简洁)。

  • 如何让.cpp里的变量和ui里的组件通过循环关联起来

    ​ 对于这个计算器来说,为了方便布局,我们把按钮都在ui拖拽了出来,那么他如何和cpp里的变量关联(当然直接相等就可以,我的意思是在好多按钮的情况下,如何用循环来使他们关联)。

    比如说ui里有btn1 btn2 btn3 …btn9几个按钮,如何在cpp里通过循环让他们赋值给btnlist[]

    解决

    findChild函数

    实例:

    this->findChild<QPushButton*>("btn"+QString::number(i));
    
  • 如何让几个btn执行一个槽函数(根据不用的btn分别执行不同的命令)

    把一组相同功能的按钮添加一个槽函数,不用每个按钮都写一个槽函数,虽然lambda表达式很好用。就比如按钮0~9,他们的功能不能说差不多,只能说完全一样(当然根据不同的id是不一样的数字)

    解决

    首先有QSignalMapper类,但是好像官方建议用lambda替代这个类。。。

    然后是通过objectname判断,这个就很像Java了

    实例:

    QString btnname=QObject::sender()->objectName();
    
  • 若干转换及常用函数

    num->QString QString里的静态函数 number()

    QString里的substr str.mid(idx,n)//从idx开始n个字符

    QString [] at 前者返回的是QCharRef 后者是QChar

    Qstring ->num str.toDouble …

    QMessageBox 主要用到里面的静态函数

    QChar->QString QString(qchar)

正文开始

逻辑还算比较好写,设置 leftnum,rightnum,flag,afterComputing四个变量

(afterComputing用来标识是否刚进行了一次运算,如果是的话,现在按数字按钮会先行清空label)

实例:
在这里插入图片描述

我们输入0.125

在这里插入图片描述

我们按下1/X
在这里插入图片描述

我们按下sqrt(X)
在这里插入图片描述
我们按下+/-
在这里插入图片描述

我们按下CE
在这里插入图片描述

​ 别的就不一一举例了

主要代码(mainwindow.cpp)

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QString>
#include<QDebug>
#include<cmath>
#include<QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    this->setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);// 窗体不能变化
    ui->setupUi(this);
    this->ui->label->setText("0");
    this->setWindowTitle("计算器_liang");

    //数字按钮们
    for(int i=0;i<10;++i)
        connect(this->findChild<QPushButton*>("btn"+QString::number(i)),QPushButton::clicked,this,btn_num_clicked);
    //按钮CE
    connect(this->ui->btnce,QPushButton::clicked,this,[=]
    {
        this->ui->label->setText("0");
        flag="";
    });
    //按钮Clear One
    connect(this->ui->btnco,QPushButton::clicked,this,[=]
    {
        QString text=this->ui->label->text();
        if(text.size()==1) text="0";
        else text=QString(text.mid(0,text.size()-1));
        this->ui->label->setText(text);
    });
    //按钮1/X sqrt(X) X2 +/-
    connect(this->ui->btnre,QPushButton::clicked,this,btn_singlefunc_clicked);
    connect(this->ui->btnsqrt,QPushButton::clicked,this,btn_singlefunc_clicked);
    connect(this->ui->btnsquare,QPushButton::clicked,this,btn_singlefunc_clicked);
    connect(this->ui->btninv,QPushButton::clicked,this,btn_singlefunc_clicked);
    //按钮+ - * / =
    connect(this->ui->btnadd,QPushButton::clicked,this,btn_doublefunc_clicked);
    connect(this->ui->btnminus,QPushButton::clicked,this,btn_doublefunc_clicked);
    connect(this->ui->btnmultply,QPushButton::clicked,this,btn_doublefunc_clicked);
    connect(this->ui->btndivide,QPushButton::clicked,this,btn_doublefunc_clicked);
    connect(this->ui->btnequal,QPushButton::clicked,this,btn_doublefunc_clicked);
    //按钮 .
    connect(this->ui->btndot,QPushButton::clicked,this,[=]
    {
        QString text=this->ui->label->text();
        if(text.size()==0)
            text="0.";
        else if(text.at(text.size()-1)!='.')
            text+=".";
        this->ui->label->setText(text);
    });
}
//按钮0~9
void MainWindow::btn_num_clicked()
{
    //如果刚刚算完数的话,再按数字,就先清空
    if(afterComputing)
    {
        this->ui->label->setText("");
        afterComputing=false;
    }
    QString btnname=QObject::sender()->objectName();
    QString num=btnname.at(btnname.size()-1);
    QString text=this->ui->label->text();
    if(text=="0") this->ui->label->setText(num);
    else this->ui->label->setText(text+num);
}
//按钮1/X sqrt(X) X2 +/-
void MainWindow::btn_singlefunc_clicked()
{

    double num=this->ui->label->text().toDouble();
    QString btnname=QObject::sender()->objectName();
    if(btnname=="btnre")
    {
        if(num!=0) num=1.0/num;
    }
    else if(btnname=="btnsqrt")
        num=sqrt(num);
    else if(btnname=="btnsquare")
        num*=num;
    else if(btnname=="btninv")
        num*=-1;
    afterComputing=true;

    this->ui->label->setText(QString::number(num));
}
// + - * / =
void MainWindow::btn_doublefunc_clicked()
{
    double num=this->ui->label->text().toDouble();
    QString btnname=QObject::sender()->objectName();
    if(btnname=="btnadd")
    {
        flag="+";
        leftnum=num;
        this->ui->label->setText("0");
    }
    else if(btnname=="btnminus")
    {
        flag="-";
        leftnum=num;
        this->ui->label->setText("0");
    }
    else if(btnname=="btnmultply")
    {
        flag="*";
        leftnum=num;
        this->ui->label->setText("0");
    }
    else if(btnname=="btndivide")
    {
        flag="/";
        leftnum=num;
        this->ui->label->setText("0");
    }
    else if(btnname=="btnequal")
    {
        afterComputing=true;
        rightnum=num;
        if(flag=="+")
            num=leftnum+rightnum;
        else if(flag=="-")
            num=leftnum-rightnum;
        else if(flag=="*")
            num=leftnum*rightnum;
        else if(flag=="/")
        {
            if(rightnum!=0)
                num=leftnum/rightnum;
            else
                QMessageBox::warning(this,"警告","除数不能是0!");
        }
        this->ui->label->setText(QString::number(num));
    }
}

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值