案例介绍
本文利用Qt实现部分计算器简单功能(包括加减乘除四则运算等)。
UI设计界面
如图所示,除了①所标记的QLineEidt类型,其它都为QPushButton类型。
UI界面控件描述如下:
序号 | 名称 | 类型 | 描述 |
---|---|---|---|
① | mainEdit | QLineEdit | 用于显示用户点击按钮输入的表达式及其计算结果 |
② | clearButton | QPushButton | text:C;清空mainEdit中所有内容 |
③ | (one)Button,括号中修改对应字符的英文 | QPushButton | text:1…;在mainEdit中添加对应字符 |
④ | delButton | QPushButton | text:<—;删除mainEdit中字符串的最后一个字符 |
⑤ | equlButton | QPushButton | text:=;计算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(为例,测试结果如下图所示。