QT练手项目,制作一个简易的计算器


前言

学习QT的使用。顺便复习一下C++

一、计算机小项目

做一个计算器小项目练手
在这里插入图片描述

二、使用步骤

1.头文件声明

代码如下(系统生成按键的槽函数省略):

class Calculator : public QMainWindow
{
    Q_OBJECT

public:
    Calculator(QWidget *parent = nullptr);
    void Paramter_plus();
    void Paramter_minus();
    void Paramter_multiply();
    void Paramter_devide();
    void return_Result(int signal=0);
    void on_botton_clicked(float num ,int signal);
    ~Calculator();
    private:
    Ui::Calculator *ui;
    int signal_flag;               //加减符号标志
    float first_mumb,second_numb;  //第一个数  第二个数
    QString Textshow;              //显示的文本
    void Change_windows_size();
    QVector<int> *p; 
}

2.实现

代码如下(示例):

void Calculator::on_botton_clicked(float num ,int signal)
{
    if(p==nullptr)
        p=new QVector<int>;                                          //创建vector用于多位数运算
    if(signal!=0)                                                    /* 有运算符之后是第二个数 */
    {
        ui->plainTextEdit->insertPlainText(QString::number(num));
        p->append(num);
    }
    else{                                                           //在运算符输入之前看作第一个数
        p->append(num);
        ui->plainTextEdit->insertPlainText(QString::number(num));
    }
}

void Calculator::on_pushButton_1_clicked()  						//按键1
{
    on_botton_clicked(1,this->signal_flag);							//传入的一个参数为值,第二个为运算符号
}

void Calculator::on_pushButton_plus_clicked()
{
    int singal=1;
    return_Result(this->signal_flag);                               //在输入运算符的时候先将前面的n位数计算
    if(signal_flag!=singal)
    {
        if(signal_flag!=0)                                          //如果在一个运算符后紧接着输入+,那么第一个运算符被覆盖掉
        {
            QTextCursor textCursor= ui->plainTextEdit->textCursor();//使用QTextCursor类(光标) 获取当前plainTextEdit的光标位置
            textCursor.deletePreviousChar();                        //删除光标之前的文本
        }
    }
    signal_flag=singal;
    ui->plainTextEdit->insertPlainText((QString)'+');
}

void Calculator::on_pushButton_min_clicked()
{
    int singal=2;
    return_Result(this->signal_flag);
    if(signal_flag!=singal)
    {
        if(signal_flag!=0)
        {
            QTextCursor textCursor= ui->plainTextEdit->textCursor();
            textCursor.deletePreviousChar();
        }
    }
    signal_flag=singal;
    ui->plainTextEdit->insertPlainText((QString)'-');
}

void Calculator::on_pushButton_mul_clicked()
{
    int singal=3;
    return_Result(this->signal_flag);
    if(signal_flag!=singal)
    {
        if(signal_flag!=0)
        {
            QTextCursor textCursor= ui->plainTextEdit->textCursor();
            textCursor.deletePreviousChar();
        }
    }
    signal_flag=singal;
    ui->plainTextEdit->insertPlainText((QString)'*');
}

void Calculator::on_pushButton_qrt_clicked()
{
    int singal=5;
    return_Result(this->signal_flag);
    if(signal_flag!=singal)
    {
        if(signal_flag!=0)
        {
            QTextCursor textCursor= ui->plainTextEdit->textCursor();
            textCursor.deletePreviousChar();
        }
    }
    signal_flag=singal;
    ui->plainTextEdit->insertPlainText((QString)"√");
}

void Calculator::on_pushButton_percent_clicked()
{
    int singal=6;
    return_Result(this->signal_flag);
    if(signal_flag!=singal)
    {
        if(signal_flag!=0)
        {
            QTextCursor textCursor= ui->plainTextEdit->textCursor();
            textCursor.deletePreviousChar();
        }
    }
    signal_flag=singal;
    ui->plainTextEdit->appendPlainText((QString)'%');
}

void Calculator::on_pushButton_dive_clicked()
{
    int singal=4;
    return_Result(signal_flag);
    if(signal_flag!=singal)
    {
        if(signal_flag!=0)
        {
            QTextCursor textCursor= ui->plainTextEdit->textCursor();
            textCursor.deletePreviousChar();
        }
    }
    signal_flag=singal;
    ui->plainTextEdit->insertPlainText((QString)'/');
}

void Calculator::on_pushButton_equal_clicked()
{
    return_Result(this->signal_flag);
    signal_flag=0;
    second_numb=0;
    ui->plainTextEdit->insertPlainText((QString)'=');
    ui->plainTextEdit->appendPlainText(QString::number(first_mumb));
}

void Calculator::return_Result(int signal)
{
    int length;
    length=p->size();
    QVector<int>::Iterator i;
    for(i=p->begin();i!=p->end();i++)
    {
        if(signal_flag!=0)                     //将vector的前n位数计算,如输入 1 1 1 ,vector{1,1,1}变为整数111
            second_numb+=*i*pow(10,--length);
        else
            first_mumb+=*i*pow(10,--length);
    }
    p->clear();									//清除vector容器内容
    switch(signal)
    {
    case 1:
        first_mumb=first_mumb+second_numb;
    break;
    case 2:
        first_mumb=first_mumb-second_numb;
    break;
    case 3:
        first_mumb=first_mumb*second_numb;
    break;
    case 4:
        first_mumb=first_mumb/second_numb;
    break;
    case 5:
        first_mumb=sqrt(first_mumb);
    break;
    case 6:
    break;
    }

}

void Calculator::on_pushButton_ce_clicked()    //ce清除本次输入的数据
{
    int num=0;
    int length=0;
    return_Result(this->signal_flag);
    if(signal_flag==0)
    {
        num=first_mumb;
        first_mumb=0;
        while(num)
        {
            length++;
            num/=10;
        }
    }else
    {
        num=second_numb;
        second_numb=0;
        while(num)
        {
            length++;
            num/=10;
        }
    }
    for (int var = 0; var < length; ++var) {
        QTextCursor textCursor= ui->plainTextEdit->textCursor();
        textCursor.deletePreviousChar();
    }
}


void Calculator::on_pushButton_c_clicked()                      //清除所有数据和文本
{
    first_mumb=0;
    second_numb=0;
    signal_flag=0;
    ui->plainTextEdit->clear();
}


void Calculator::on_pushButton_delet_clicked()                  //←键如果容器不为空则删除1个元素
{
    if(p->size()!=0)
    {
        p->removeLast();
        QTextCursor textCursor= ui->plainTextEdit->textCursor();
        textCursor.deletePreviousChar();
    }
}



总结

学习C以后学习C++,要多以面向对象的方式思考编程,在text文本中可以使用光标对于内容进行一些操作,对于block输入还未尝试,后面有机会慢慢接触到,要源码的同学请留言。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值