界面设计如图所示,并修改相应按钮的名字。
在头文件中定义一个全局变量expression,记录输入的所有内容,只有在按下等于号时候才开始计算,在未按之前显示在输入框中。
设置点击1的按钮时候,显示1
设置窗口名字和显示框的字体大小
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("计算器");
QFont f("仿宋",10); //字体对象
ui->mainlineEdit->setFont(f);
}
点击AC按钮会清空输入框,实现代码:
void Widget::on_clearButton_clicked()
{
expression.clear();
ui->mainlineEdit->clear();
}
将右上角删除按钮上面的字先删除,在上面添加图片,在Widget函数内写
//在按钮上添加图片
QIcon con("C:\\Users\\30281\\Desktop\\del.png");
ui->delButton->setIcon(con);
删除按钮逻辑代码
void Widget::on_delButton_clicked()
{
expression.chop(1);
ui->mainlineEdit->setText(expression);
}
改变按钮颜色,同样在在Widget函数内写
//改变按钮背景颜色
ui->equalButton->setStyleSheet("background:skyblue");
使用栈来实现计算的功能
在头文件中应用栈库 #include <QStack>
完整代码:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("计算器");
QFont f("微软雅黑",14); //字体对象
ui->mainlineEdit->setFont(f);
//在按钮上添加图片
QIcon con("C:\\Users\\30281\\Desktop\\del.png");
ui->delButton->setIcon(con);
//改变按钮背景颜色
ui->equalButton->setStyleSheet("background:skyblue");
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_oneButton_clicked()
{
expression += "1";
ui->mainlineEdit->setText(expression);
}
void Widget::on_twoButto_clicked()
{
expression += "2";
ui->mainlineEdit->setText(expression);
}
void Widget::on_threeButton_clicked()
{
expression += "3";
ui->mainlineEdit->setText(expression);
}
void Widget::on_fourButton_clicked()
{
expression += "4";
ui->mainlineEdit->setText(expression);
}
void Widget::on_fiveButton_clicked()
{
expression += "5";
ui->mainlineEdit->setText(expression);
}
void Widget::on_sixButton_clicked()
{
expression += "6";
ui->mainlineEdit->setText(expression);
}
void Widget::on_sevenButton_clicked()
{
expression +="7";
ui->mainlineEdit->setText(expression);
}
void Widget::on_eightButton_clicked()
{
expression +="8";
ui->mainlineEdit->setText(expression);
}
void Widget::on_nineButton_clicked()
{
expression += "9";
ui->mainlineEdit->setText(expression);
}
void Widget::on_addButton_clicked()
{
expression += "+";
ui->mainlineEdit->setText(expression);
}
void Widget::on_subButton_clicked()
{
expression +="-";
ui->mainlineEdit->setText(expression);
}
void Widget::on_leftButton_clicked()
{
expression += "(";
ui->mainlineEdit->setText(expression);
}
void Widget::on_zeroButton_clicked()
{
expression += "0";
ui->mainlineEdit->setText(expression);
}
void Widget::on_rightButton_clicked()
{
expression +=")";
ui->mainlineEdit->setText(expression);
}
void Widget::on_mulButton_clicked()
{
expression += "*";
ui->mainlineEdit->setText(expression);
}
void Widget::on_divButton_clicked()
{
expression += "/";
ui->mainlineEdit->setText(expression);
}
void Widget::on_clearButton_clicked()
{
expression.clear();
ui->mainlineEdit->clear();
}
void Widget::on_delButton_clicked()
{
expression.chop(1);
ui->mainlineEdit->setText(expression);
}
void Widget::on_equalButton_clicked()
{
QStack<int> s_num ,s_opt;
char opt[128]={0};
int i=0 ,tmp =0 ,num1,num2;
//把QString 转换成 char *
QByteArray ba;
ba.append(expression); //把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;
}
}
}
}
ui->mainlineEdit->setText(QString::number(s_num.top()));
expression.clear();
}
int Widget::Priority(char ch)
{
switch (ch)
{
case '(':
return 3;
case '*':
case '/':
return 2;
case '+':
case '-':
return 1;
default:
return 0;
}
}
补充设置窗口大小,在Widget函数内:
this->setMaximumSize(200,280);
this->setMinimumSize(200,280);