Bootstrap

QT实例1(简单计算器)

案例介绍

本文利用Qt实现部分计算器简单功能(包括加减乘除四则运算等)。

UI设计界面

在这里插入图片描述

如图所示,除了①所标记的QLineEidt类型,其它都为QPushButton类型。

UI界面控件描述如下:

序号名称类型描述
mainEditQLineEdit用于显示用户点击按钮输入的表达式及其计算结果
clearButtonQPushButtontext:C;清空mainEdit中所有内容
(one)Button,括号中修改对应字符的英文QPushButtontext:1…;在mainEdit中添加对应字符
delButtonQPushButtontext:<—;删除mainEdit中字符串的最后一个字符
equlButtonQPushButtontext:=;计算mianEdit中表达式的结果并将其显示到mainEdit中

程序实现

以下省略了部分自动生成代码以及重复冗余代码,仅展示部分核心代码。

widget.h头文件

头文件中声明十九个槽函数,并声明两个函数用于计算算数表达式,其中int Priority(char ch)用于获取运算符的优先级,float Fingure(char ch,float num1,float num2)用于计算两个操作数的算数运算。

private slots:
    void on_oneButton_clicked();
    void on_twoButton_clicked();
    void on_threeButton_clicked();
    void on_fourButton_clicked();
    void on_fiveButton_clicked();
    void on_sixButton_clicked();
    void on_sevenButton_clicked();
    void on_eightButton_clicked();
    void on_nineButton_clicked();
    void on_zeroButton_clicked();
    void on_leftButton_clicked();
    void on_rightButton_clicked();
    void on_addButton_clicked();
    void on_divButton_2_clicked();
    void on_mulButton_clicked();
    void on_divButton_clicked();
//以上槽函数用于输出用户点击的按钮字符
    void on_clearButton_clicked();
    void on_delButton_clicked();
    void on_equlButton_clicked();
private:
    Ui::Widget *ui;
    QString expression;
    int Priority(char ch);
    float Fingure(char ch,float num1,float num2);

widget.cpp源文件

按钮点击的槽函数:用于输入信息的槽函数与void Widget::on_oneButton_clicked()一样,只需修改expression+=“(该字符)”,此处已省略;void Widget::on_clearButton_clicked():清空mainEdit中内容以及expression字符串;void Widget::on_delButton_clicked():将expression字符串中的最后一个字符删除,并将expression显示到mainEdit中;void Widget::on_equlButton_clicked():将expression字符串中的操作数和操作符分离出来存储的两个栈中,并计算出结果显示到mainEdit中。

int Priority(char ch):用于获取运算符的优先级

float Fingure(char ch,float num1,float num2):用于计算两个操作数的算数运算。

void Widget::on_oneButton_clicked()
{
    expression+="1";
    ui->mainEdit->setText(expression);
}
//其他的用于输入信息的槽函数与on_oneButton_clicked()一样,只需修改expression+="(该字符)",此处已省略
void Widget::on_clearButton_clicked()
{
    expression.clear();
    ui->mainEdit->clear();
}
void Widget::on_delButton_clicked()
{
    expression.chop(1);//删除字符串中最后1位
    ui->mainEdit->setText(expression);
}
void Widget::on_equlButton_clicked()
{
    QStack<float> num;
    QStack<char> option;
    char opt[128] ={0};
    QByteArray arr=expression.toLatin1();//将QString类型转换为char型
    strcpy(opt, arr.data());
    int i=0,temp=0;
    while(opt[i]!='\0'||option.isEmpty()!=true)
    { //对操作数进行处理
        if(opt[i] >= '0' && opt[i] <= '9')
        {
            temp = temp * 10 + opt[i] - '0';
            i++;
            if(opt[i] < '0' || opt[i] > '9')
            {//判断操作数是否完整,若完整则直接进栈
                num.push(temp);
                temp = 0;
            }
        }
        else//对操作符进行处理
        {
            if(opt[i+1]!='\0' && (opt[i+1] < '0' || opt[i+1] > '9'))
            {//输入表达式异常处理
                if((opt[i]!='('&&opt[i]!=')')&&opt[i+1]!='(')
                {
                    QMessageBox::information(this,"提示","ERROR!!!\nPlease enter the correct expression!");
                    exit(1);
                }
            }
            else if(option.isEmpty()||Priority(opt[i])>Priority(option.top())||(option.top()=='('&&opt[i]!=')'))
            {
                option.push(opt[i]);
                i++;
                continue;
            }
            else if(option.top()=='('&&opt[i]==')')
            {//()匹配时直接将(出栈
                option.pop();
                i++;
                continue;
            }
            else if(Priority(opt[i])<=Priority(option.top())||(option.top()!='('&&opt[i]==')')||(opt[i]=='\0'&&option.empty()!=true))
            {//将操作符出栈,并出栈两个操作数,进行计算,最后将结果入栈
                char ch=option.top();//存放操作符
                option.pop();
                float num1=num.top();
                num.pop();
                float num2=num.top();
                num.pop();
                float result=Fingure(ch,num2,num1);
                num.push(result);
            }
            else{
                break;
            }
        }
    }
    expression=QString::number(num.top());//将float型转换为QString类型
    ui->mainEdit->setText(expression);
    expression.clear();
}
float Widget::Fingure(char ch,float num1,float num2)
{
//计算两个操作数之间的四则运算
    switch (ch) {
    case '+':
        return num1+num2;
    case '-':
        return num1-num2;
    case '*':
        return num1*num2;
    case '/':
        return num1/num2;
    default:
        return 0;
    }
}
int Widget::Priority(char ch)
{//确定操作符的优先级
    switch (ch) {
    case '(':
        return 3;
    case '*':
    case '/':
        return 2;
    case '+':
    case '-':
        return 1;
    default:
        return 0;
    }
}

功能测试

输入正确的表达式进行测试,以(15-9)*10/(4+4)=7.5为例,测试结果如下图所示。

在这里插入图片描述
输入错误表达式进行测试,以11+)2*3(为例,测试结果如下图所示。

在这里插入图片描述

;