思路:
1.新建一个widget工程
2.在ui界面选择好自己需要的组件(这里选择2个label用于显示计算的结果和运算符号,16个pushButton按钮用于显示按键)
3.利用两个全局整数代表计算的前一个数据和后一个数据
4.利用信号与槽机制设置好点击按钮以后在label界面显示的数据
ui界面如图:
注意:最上面有两个label组件,第一个用于显示运算符号,第二个用于显示运算数据,且只支持整数运算
代码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QString ch;
private slots:
void on_button1_clicked();
void on_button2_clicked();
void on_button3_clicked();
void on_button4_clicked();
void on_button5_clicked();
void on_button6_clicked();
void on_button7_clicked();
void on_button8_clicked();
void on_button9_clicked();
void on_button0_clicked();
void on_buttonclear_clicked();
void on_buttonjia_clicked();
void on_buttonjian_clicked();
void on_buttoncheng_clicked();
void on_buttonchu_clicked();
void on_buttondeng_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QString>
int first=0; //用于显示计算的前一个数据
int second=0; //用于显示计算的前一个数据
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("计算器");
ui->label->setAutoFillBackground(true);//设置自动填充背景
ui->label->setPalette(QPalette(QColor(Qt::white)));//设置调色板
ui->label_2->setAutoFillBackground(true);//设置自动填充背景
ui->label_2->setPalette(QPalette(QColor(Qt::white)));//设置调色板
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_button1_clicked()
{
second=second*10+1;//second原本为0按下一个按键以后计算其值
ch=QString::number(second);//将计算的值转为字符串(因为label只能显示字符串)
ui->label->setText(ch);//将字符串显示在label组件里面
}
void Widget::on_button2_clicked()
{
second=second*10+2;
ch=QString::number(second);
ui->label->setText(ch);
}
void Widget::on_button3_clicked()
{
second=second*10+3;
ch=QString::number(second);
ui->label->setText(ch);
}
void Widget::on_button4_clicked()
{
second=second*10+4;
ch=QString::number(second);
ui->label->setText(ch);
}
void Widget::on_button5_clicked()
{
second=second*10+5;
ch=QString::number(second);
ui->label->setText(ch);
}
void Widget::on_button6_clicked()
{
second=second*10+6;
ch=QString::number(second);
ui->label->setText(ch);
}
void Widget::on_button7_clicked()
{
second=second*10+7;
ch=QString::number(second);
ui->label->setText(ch);
}
void Widget::on_button8_clicked()
{
second=second*10+8;
ch=QString::number(second);
ui->label->setText(ch);
}
void Widget::on_button9_clicked()
{
second=second*10+9;
ch=QString::number(second);
ui->label->setText(ch);
}
void Widget::on_button0_clicked()
{
second=second*10;
ch=QString::number(second);
ui->label->setText(ch);
}
void Widget::on_buttonclear_clicked()//c键即清空键,清空所有数据即可
{
first=0;
second=0;
ui->label->setText("0");
ui->label_2->setText("");
}
void Widget::on_buttonjia_clicked()
{
if(first!=0)//first==0就代表第一次按下符号键,若为第二次符号键则需要计算前一次的计算结果
{
QString s=ui->label_2->text();//获取label_2组件里面的数据(为字符串)
if(s=="+")//判断前一次计算的符号
{
first+=second;//如果前一次为加法,则先计算加法
ch=QString::number(first);//将计算后的结果转为字符串
ui->label->setText(ch);//显示转换后的字符串
}
else if(s=="-")
{
first-=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="*")
{
first*=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="/")
{
first/=second;
ch=QString::number(first);
ui->label->setText(ch);
}
}
else
first=second;//如果时第一次输入数据等待符号输入
second=0;//计算后的结果给了first,senond用于下一次输入数据因此一定要置零
ui->label_2->setText("+");
}
void Widget::on_buttonjian_clicked()
{
if(first!=0)
{
QString s=ui->label_2->text();
if(s=="+")
{
first+=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="-")
{
first-=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="*")
{
first*=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="/")
{
first/=second;
ch=QString::number(first);
ui->label->setText(ch);
}
}
else
first=second;
second=0;
ui->label_2->setText("-");
}
void Widget::on_buttoncheng_clicked()
{
if(first!=0)
{
QString s=ui->label_2->text();
if(s=="+")
{
first+=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="-")
{
first-=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="*")
{
first*=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="/")
{
first/=second;
ch=QString::number(first);
ui->label->setText(ch);
}
}
else
first=second;
second=0;
ui->label_2->setText("*");
}
void Widget::on_buttonchu_clicked()
{
if(first!=0)
{
QString s=ui->label_2->text();
if(s=="+")
{
first+=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="-")
{
first-=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="*")
{
first*=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="/")
{
first/=second;
ch=QString::number(first);
ui->label->setText(ch);
}
}
else
first=second;
second=0;
ui->label_2->setText("/");
}
void Widget::on_buttondeng_clicked()//按下等号以后就代表此次计算结束所以计算并显示结果以后将first与second置零用于之后的计算
{
QString s=ui->label_2->text();
if(s=="+")
{
first+=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="-")
{
first-=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="*")
{
first*=second;
ch=QString::number(first);
ui->label->setText(ch);
}
else if(s=="/")
{
first/=second;
ch=QString::number(first);
ui->label->setText(ch);
}
first=0;
second=0;
ui->label_2->setText("");
}
效果截图
还未输入数据所以第一个label组件是空的,第二label组件显示运算数据初始为0。