目录
1.实现效果图展示:
下面附有博主的源代码,感兴趣的可以试试自己实现一个计算器哦
2.widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QStack>
#include<QProcess>
#include<QMessageBox>
#include<QIcon>
#include<QPalette>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_DivButton_clicked();
void on_MulButton_clicked();
void on_ClearButton_clicked();
void on_oneButton_clicked();
void on_twoButton_clicked();
void on_threeButton_clicked();
void on_SumButton_clicked();
void on_fourButton_clicked();
void on_fiveButton_clicked();
void on_sixButton_clicked();
void on_SubButton_clicked();
void on_sevenButton_clicked();
void on_eightButton_clicked();
void on_nineButton_clicked();
void on_EqualButton_clicked();
void on_zeroButton_clicked();
void on_DropButton_clicked();
void on_LeftButton_clicked();
void on_RightButton_clicked();
int Priority(char ch);
private:
Ui::Widget *ui;
QString expression;
char ch;
};
#endif // WIDGET_H
3.main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
4.widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
setAutoFillBackground(true);
ui->setupUi(this);
this->setWindowTitle("计算器");
QFont f("黑体",14); //字体对象
ui->CmdlineEdit->setFont(f);
//按钮上放图片
QIcon con("G:/picture/12.webp");
ui->DropButton->setIcon(con);
ui->DropButton->setIconSize(QSize(50,50));
ui->DivButton->setFlat(true);
//改变按钮背景的颜色
ui->DivButton->setStyleSheet("background:gold");
ui->EqualButton->setStyleSheet("background:gold");
ui->SubButton->setStyleSheet("background:gold");
ui->MulButton->setStyleSheet("background:gold");
ui->ClearButton->setStyleSheet("background:gold");
ui->RightButton->setStyleSheet("background:gold");
ui->LeftButton->setStyleSheet("background:gold");
ui->zeroButton->setStyleSheet("background:gold");
ui->oneButton->setStyleSheet("background:gold");
ui->twoButton->setStyleSheet("background:gold");
ui->threeButton->setStyleSheet("background:gold");
ui->fourButton->setStyleSheet("background:gold");
ui->SumButton->setStyleSheet("background:gold");
ui->fiveButton->setStyleSheet("background:gold");
ui->sixButton->setStyleSheet("background:gold");
ui->sevenButton->setStyleSheet("background:gold");
ui->eightButton->setStyleSheet("background:gold");
ui->nineButton->setStyleSheet("background:gold");
QPalette palette;
palette.setBrush(QPalette::Background,QBrush(QPixmap("G:\\picture\\calculate.webp")));
setPalette(palette);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_DivButton_clicked()
{
expression += "/";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_MulButton_clicked()
{
expression += "*";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_ClearButton_clicked()
{
expression.clear();
ui->CmdlineEdit->clear();
}
void Widget::on_oneButton_clicked()
{
expression += "1";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_twoButton_clicked()
{
expression += "2";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_threeButton_clicked()
{
expression += "3";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_SumButton_clicked()
{
expression += "+";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_fourButton_clicked()
{
expression += "4";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_fiveButton_clicked()
{
expression += "5";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_sixButton_clicked()
{
expression += "6";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_SubButton_clicked()
{
expression += "-";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_sevenButton_clicked()
{
expression += "7";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_eightButton_clicked()
{
expression += "8";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_nineButton_clicked()
{
expression += "9";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_DropButton_clicked()
{
expression.chop(1);
ui->CmdlineEdit->setText(expression);
}
void Widget::on_zeroButton_clicked()
{
expression += "0";
ui->CmdlineEdit->setText(expression);
}
//优先级判断
int Widget::Priority(char ch)
{
switch (ch)
{
case '(':
return 3;
case '*':
case '/':
return 2;
case '+':
case '-':
return 1;
default:
return 0;
}
}
void Widget::on_LeftButton_clicked()
{
expression += "(";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_RightButton_clicked()
{
expression += ")";
ui->CmdlineEdit->setText(expression);
}
void Widget::on_EqualButton_clicked()
{
//计算器
QStack<int> s_num,s_opt;
//将Qstring转成char*
QByteArray ba;
ba.append(expression);
char opt[128] = {0};
strcpy(opt,ba.data());
int i = 0,tmp = 0,num1,num2;
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;
default:
break;
}
}
}
}
ui->CmdlineEdit->setText(QString::number(s_num.top()));
expression.clear();
}