1.计算器界面设计
由图可知,我们需要20个按钮,一个行编辑文本。
先摆放好按钮位置,再使用栅格布局
按钮全选中使用栅格布局,使其整齐些
接着修改按钮数字,可以按照计算器格式摆放
接着我们修改每个对象的名称,待会写代码比较方便,数字的话,直接是
onebutton,twobutton … 删除一位叫cancelonebutton,删除全部叫cancelallbutton,左括号和右括号分别叫做leftbutton ,rightbutton ,no叫做nobutton,+叫做addbutton,-叫做subbutton,*叫做mulbutton,/叫做divbutton,=叫做amountbutton
2.代码部分
修改完成,下面我们要做的是按下一个按钮,然后输出在行编辑中,我们使用一个字符串,比方说1被按下,然后我们让这个字符串+=‘1’,然后将这个字符串输出在行编辑中,使用到之前说的信号与槽,右击按钮,然后转到槽
测试一下,点击单个
单键
同理,使用同样方法实现所有数字和±*/()
void Widget::on_zerobutton_clicked()
{
str+='0';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_onebutton_clicked()
{
str+='1';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_twobutton_clicked()
{
str+='2';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_threebutton_clicked()
{
str+='3';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_fourbutton_clicked()
{
str+='4';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_fivebutton_clicked()
{
str+='5';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_sixbutton_clicked()
{
str+='6';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_sevenbutton_clicked()
{
str+='7';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_eightbutton_clicked()
{
str+='8';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_ninebutton_clicked()
{
str+='9';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_leftbutton_clicked()
{
str+='(';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_rightbutton_clicked()
{
str+=')';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_addbutton_clicked()
{
str+='+';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_divbutton_clicked()
{
str+='/';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_mulbutton_clicked()
{
str+='*';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
void Widget::on_subbutton_clicked()
{
str+='-';
ui->lineEdit->setText(str);//设置到行文本编辑里面
}
测试:
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="TSyoiKD9-1723372936370" src="https://live.csdn.net/v/embed/416676"></iframe>重复
删除一个和全部删除实现,删除一个使用函数chop,参数为从结尾开始删除几个,chop(1);全部删除使用str.clear(),然后设置字符串进文本编辑中
删除一个:
全部删除:
测试:
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="qzn1MxvH-1723372950357" src="https://live.csdn.net/v/embed/416678"></iframe>删除一个和全部
调节大小:
拖拽移动即可。
设置边框/以及句柄显示
边框比窗口大一点即可260*300,在构造函数中调用
显示句柄:名字叫计算器,也在构造函数中添加函数
将删除一个我们可以贴图片上去:
我们截屏电脑计算器上的删除键
将图片保存在该工程对应文件下面,找到图片所在路径,D:\12\calculate
然后使用的函数为
该函数也是在构造函数中。
在ui界面删掉d
将图片调大些
放不大了,
最后还有一个等号的实现,等号实现就是需要将str字符串中的算式进行运算,然后显示在行编辑中,这里可以参考力扣227基本计算器的实现2
所需的头文件;
给出等号代码部分:
int Widget::Priority(char ch)
{
switch(ch)
{
case '(':
return 3;
case '*':
case '/':
return 2;
case '+':
case '-':
return 1;
default:
return 0;
}
}
void Widget::on_amountbutton_clicked()
{
QStack<int> s_num, s_opt;
char opt[128] = {0};
int i = 0, tmp = 0, num1, num2;
//把QString转换成char *
QByteArray ba;
ba.append(str); //把QString转换成QByteArray
strcpy(opt, ba.data()); //data可以把QByteArray转换成const char *
while (opt[i] != '\0' || s_opt.empty() != true)
{
if (opt[i] >= '0' && opt[i] <= '9')
{
tmp = tmp * 10 + opt[i] - '0';
i++;
if (opt[i] < '0' || opt[i] > '9')
{
s_num.push(tmp);
tmp = 0;
}
}
else //操作符
{
if (s_opt.empty() == true || Priority(opt[i]) > Priority(s_opt.top()) ||
(s_opt.top() == '(' && opt[i] != ')'))
{
s_opt.push(opt[i]);
i++;
continue;
}
if (s_opt.top() == '(' && opt[i] == ')')
{
s_opt.pop();
i++;
continue;
}
if (Priority(opt[i]) <= Priority(s_opt.top()) || (opt[i] == ')' && s_opt.top() != '(') ||
(opt[i] == '\0' && s_opt.empty() != true))
{
char ch = s_opt.top();
s_opt.pop();
/*减法和除法,先出栈的作为第二个参数 后缀表达式*/
switch(ch)
{
case '+':
num1 = s_num.top();
s_num.pop();
num2 = s_num.top();
s_num.pop();
s_num.push(num1 + num2);
break;
case '-':
num1 = s_num.top();
s_num.pop();
num2 = s_num.top();
s_num.pop();
s_num.push(num2 - num1);
break;
case '*':
num1 = s_num.top();
s_num.pop();
num2 = s_num.top();
s_num.pop();
s_num.push(num1 * num2);
break;
case '/':
num1 = s_num.top();
s_num.pop();
num2 = s_num.top();
s_num.pop();
s_num.push(num2 / num1);
break;
}
}
}
}
str.clear();
ui->lineEdit->setText(QString::number(s_num.top()));//int
}
测试:
实现
标签:opt,Widget,qt,实现,文本编辑,num,ui,str,计算器 From: https://blog.csdn.net/yyqzjw/article/details/141107587