在写文章之前,我想先建议大家在做任何项目的时候,都需要做好草稿,不用写太多的代码,只是建议走一下流程,把思路逻辑与实现方法理清楚。
因为刚开始的时候,我觉得计算器应该很简单,而且之前学C++基础的时候有在控制台上实现过计算器的功能,所以并没有打草稿。后来发现真的错了,因为有很多内容还是要一步一步实现的,例如除数等于0的时候,程序会崩溃,两次同时按下“+”,会发生什么,等等等等,以至于我的逻辑最后越来越乱,只能重新理一遍思路,再把要实现的内容实现完。
废话不多说,先进入项目吧。这次的计算器还是算比较简易的,只实现了整数的加减乘除(这里的除是取整),并没有小数的加入
第一步:
新建项目,基类为QWidget,选择带ui界面
第二步:
界面ui设计,使用ui设计师模式,通过改变样式表,与改变参数与按钮名称,结果如图所示
第三步:
将相应按钮通过转到槽,设置函数
第四步:
在主函数里面声明变量
private:
Ui::Widget *ui;
int num1,num2,result;//储存第一个数、第二个数、结果
bool isNum1;//判断输入的是第一个数还是第二个数
int opetrat;//储存四个运算符
QString str;//lineEdit显示的内容
bool isContinue;//判断一次结束后是否继续
bool opetratHasClicked;//判断运算符是否按下过一次
然后在构造函数中初始化
ui->setupUi(this);
num1=0;
num2=0;
result=0;
isNum1=true;
opetrat=0;
isContinue=false;
opetratHasClicked=false;
str="";
按钮0~9与加减乘除原理都一样,所以我只说明一个
按键1的实现:
void Widget::on_btn_1_clicked()
{
if(isContinue){//判断一次运算之后是否继续进行,不是的话,直接计算下一个数,是的话,计算第二个数
num1=1;
str="1";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+1;
}else {
num2=num2*10+1;
}
str+="1";
ui->lineEdit->setText(str);
}
}
“+“键的实现:
void Widget::on_btn_add_clicked()
{
if(isContinue){num1=result;isContinue=false;}//判断一次计算后是否继续
opetrat=1;
if(opetratHasClicked&&opetrat!=1){//防止一次计算中按下两次运算符
str=str.left(str.size()-1);
str+="+";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}else if(opetratHasClicked) {
isNum1=false;
opetratHasClicked=true;
}else {
if(str==""){}
else
{
str+="+";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}
}
}
“=“号键的实现:
void Widget::on_btn_equal_clicked()
{
if(opetratHasClicked)
{
switch(opetrat){//判断加减乘除符号
case 1:
result=num1+num2;
str.setNum(result);
ui->lineEdit->setText(str);
break;
case 2:
result=num1-num2;
str.setNum(result);
ui->lineEdit->setText(str);
break;
case 3:
result=num1*num2;
str.setNum(result);
ui->lineEdit->setText(str);
break;
case 4:
if(num2==0){//防止除数为0
str.clear();
ui->lineEdit->clear();
break;
}
else{
result=num1/num2;
str.setNum(result);
ui->lineEdit->setText(str);
break;
}
}
isContinue=true;
isNum1=false;
num2=0;
opetratHasClicked=false;
}
重置键的实现
void Widget::on_btn_del_clicked()
{
//只需把参数还原成构造函数中的参数,屏幕清空
num1=0;
num2=0;
result=0;
isNum1=true;
opetrat=0;
isContinue=false;
opetratHasClicked=false;
str="";
ui->lineEdit->clear();
}
第五步:
改变ico,打包,运行结果如图所示
代码源文件如下
.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_btn_1_clicked();
void on_btn_2_clicked();
void on_btn_add_clicked();
void on_btn_equal_clicked();
void on_btn_minus_clicked();
void on_btn_del_clicked();
void on_btn_3_clicked();
void on_btn_0_clicked();
void on_btn_4_clicked();
void on_btn_5_clicked();
void on_btn_6_clicked();
void on_btn_7_clicked();
void on_btn_9_clicked();
void on_btn_8_clicked();
void on_btn_mul_clicked();
void on_btn_div_clicked();
private:
Ui::Widget *ui;
int num1,num2,result;//储存第一个数、第二个数、结果
bool isNum1;//判断输入的是第一个数还是第二个数
int opetrat;//储存四个运算符
QString str;//lineEdit显示的内容
bool isContinue;//判断一次结束后是否继续
bool opetratHasClicked;//判断运算符是否按下过一次
};
#endif // WIDGET_H
.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include
#include
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
num1=0;
num2=0;
result=0;
isNum1=true;
opetrat=0;
isContinue=false;
opetratHasClicked=false;
str="";
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btn_1_clicked()
{
if(isContinue){//判断一次运算之后是否继续进行,不是的话,直接计算下一个数,是的话,计算第二个数
num1=1;
str="1";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+1;
}else {
num2=num2*10+1;
}
str+="1";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_2_clicked()
{
if(isContinue){
num1=2;
str="2";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+2;
}else {
num2=num2*10+2;
}
str+="2";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_add_clicked()
{
if(isContinue){num1=result;isContinue=false;}//判断一次计算后是否继续
opetrat=1;
if(opetratHasClicked&&opetrat!=1){//防止一次计算中按下两次运算符
str=str.left(str.size()-1);
str+="+";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}else if(opetratHasClicked) {
isNum1=false;
opetratHasClicked=true;
}else {
if(str==""){}
else
{
str+="+";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}
}
}
void Widget::on_btn_minus_clicked()
{
if(isContinue){num1=result;isContinue=false;}
opetrat=2;
if(opetratHasClicked&&opetrat!=2){
str=str.left(str.size()-1);
str+="-";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}else if(opetratHasClicked) {
isNum1=false;
opetratHasClicked=true;
}else {
if(str==""){}
else
{
str+="-";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}
}
}
void Widget::on_btn_equal_clicked()
{
if(opetratHasClicked)
{
switch(opetrat){//判断加减乘除符号
case 1:
result=num1+num2;
str.setNum(result);
ui->lineEdit->setText(str);
break;
case 2:
result=num1-num2;
str.setNum(result);
ui->lineEdit->setText(str);
break;
case 3:
result=num1*num2;
str.setNum(result);
ui->lineEdit->setText(str);
break;
case 4:
if(num2==0){//防止除数为0
str.clear();
ui->lineEdit->clear();
break;
}
else{
result=num1/num2;
str.setNum(result);
ui->lineEdit->setText(str);
break;
}
}
isContinue=true;
isNum1=false;
num2=0;
opetratHasClicked=false;
}
}
void Widget::on_btn_del_clicked()
{
//只需把参数还原成构造函数中的参数,屏幕清空
num1=0;
num2=0;
result=0;
isNum1=true;
opetrat=0;
isContinue=false;
opetratHasClicked=false;
str="";
ui->lineEdit->clear();
}
void Widget::on_btn_3_clicked()
{
if(isContinue){
num1=3;
str="3";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+3;
}else {
num2=num2*10+3;
}
str+="3";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_0_clicked()
{
if(isContinue){
num1=0;
str="0";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+0;
}else {
num2=num2*10+0;
}
str+="0";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_4_clicked()
{
if(isContinue){
num1=4;
str="4";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+4;
}else {
num2=num2*10+4;
}
str+="4";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_5_clicked()
{
if(isContinue){
num1=5;
str="5";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+5;
}else {
num2=num2*10+5;
}
str+="5";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_6_clicked()
{
if(isContinue){
num1=6;
str="6";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+6;
}else {
num2=num2*10+6;
}
str+="6";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_7_clicked()
{
if(isContinue){
num1=7;
str="7";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+7;
}else {
num2=num2*10+7;
}
str+="7";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_9_clicked()
{
if(isContinue){
num1=9;
str="9";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+9;
}else {
num2=num2*10+9;
}
str+="9";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_8_clicked()
{
if(isContinue){
num1=8;
str="8";
ui->lineEdit->setText(str);
isContinue=false;
isNum1=true;
}
else
{
if(isNum1){
num1=num1*10+8;
}else {
num2=num2*10+8;
}
str+="8";
ui->lineEdit->setText(str);
}
}
void Widget::on_btn_mul_clicked()
{
if(isContinue){num1=result;isContinue=false;}
opetrat=3;
if(opetratHasClicked&&opetrat!=3){
str=str.left(str.size()-1);
str+="*";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}else if(opetratHasClicked) {
isNum1=false;
opetratHasClicked=true;
}else {
if(str==""){}
else
{
str+="*";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}
}
}
void Widget::on_btn_div_clicked()
{
if(isContinue){num1=result;isContinue=false;}
opetrat=4;
if(opetratHasClicked&&opetrat!=4){
str=str.left(str.size()-1);
str+="÷";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}else if(opetratHasClicked) {
isNum1=false;
opetratHasClicked=true;
}else {
if(str==""){}
else
{
str+="÷";
ui->lineEdit->setText(str);
isNum1=false;
opetratHasClicked=true;
}
}
}
main文件不变
谢谢大家的支持,有什么不足希望指出,一起学习,一起进步