本文章只实现了最最基础的计算器功能,相比起一般的计算器还有些不足,强烈建议读者在阅读完本文章之后,在已经了解的情况下,对其进行优化,如想实现更多功能,建议将LCD控件改为Text edit控件。
废话不多说,先上图:
QT创建项目应该不用多说,在创建项目之后打开Forms目录下的ui文件(双击)
根据自己的喜好和想要实现的功能加入空间,此计算器只使用了Push button控件、LCD number控件,同时记住修改控件对象名称方便记忆使用
此时注意,LCD控件默认只能显示5个数字,因此我们需要进行修改,同时在LCD最多只显示10个数字,在编写代码时我们会对其进行设置
选中lcd控件,在右下侧寻找digitCount选项,修改需要显示的数字,我修改的是12
计算器界面设置好后,就需要我们对其进行信号和槽的编写了
数字键:
右键数字控件,点击转到槽,选择clicked点击事件,跳转到代码界面
因为LCD只显示10位,我们定义一个全局变量cont,然后编程
void MainWindow::on_one_clicked() //数字1的槽函数
{
if(cont < 10) //在文件头部定义的全局变量
{
int num = ui->evaDisplay->value(); //evaDisplay是我给lcd显示屏的对象名字
num = num * 10 + 1;
ui->evaDisplay->display(num);
cont++;
}
}
哪个数字的按键,就在num * 10 + 后面加上对应数字
清空键:
同数字键一样转到槽
void MainWindow::on_clear_clicked()
{
ui->evaDisplay->display(0);
cont = 0;
}
运算符键:
同数字键一样转到槽
通过观察计算器我们可以发现,一般的计算器是在输入一串数字后,点击运算符时,显示屏清空,此时输入第二串数字,最后点击等于才会出现结果,因此我们在点击运算符时,使用全局变量num1存储第一次的值,全局变量res存储哪个运算的操作。
void MainWindow::on_myAdd_clicked() //+号
{
num1 = ui->evaDisplay->value();
on_clear_clicked(); //清空键
res = 1;
}
等于键:
读取res获取当前操作
void MainWindow::on_result_clicked()
{
switch (res)
{
case 1: //+
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 + num2);
break;
case 2: //-
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 - num2);
break;
case 3: //*
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 * num2);
break;
case 4: //“/”
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 / num2);
break;
case 5: //%
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 % num2);
break;
}
}
退格键:
每次退格会重新计算cont,因为前面未对cont上限进行限制,避免cont溢出,导致LCD显示数量变化
void MainWindow::on_point_clicked()
{
int num = ui->evaDisplay->value();
cont = 0;
ui->evaDisplay->display(num / 10);
num /= 10;
while(num != 0)
{
num /= 10;
cont++;
//qDebug() << cont;
}
}
全局变量:
int cont = 0,num1 = 0,num2 = 0,res = 0;
至此,计算器实现,所有代码将一并奉上:
#include "mainwindow.h"
#include "ui_mainwindow.h"
int cont = 0,num1 = 0,num2 = 0,res = 0;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_one_clicked()
{
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 1;
//num = static_cast<float>(num);
ui->evaDisplay->display(num);
cont++;
}
}
void MainWindow::on_two_clicked()
{
cont++;
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 2;
ui->evaDisplay->display(num);
}
}
void MainWindow::on_three_clicked()
{
cont++;
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 3;
ui->evaDisplay->display(num);
}
}
void MainWindow::on_four_clicked()
{
cont++;
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 4;
ui->evaDisplay->display(num);
}
}
void MainWindow::on_five_clicked()
{
cont++;
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 5;
ui->evaDisplay->display(num);
}
}
void MainWindow::on_six_clicked()
{
cont++;
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 6;
ui->evaDisplay->display(num);
}
}
void MainWindow::on_seven_clicked()
{
cont++;
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 7;
ui->evaDisplay->display(num);
}
}
void MainWindow::on_eight_clicked()
{
cont++;
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 8;
ui->evaDisplay->display(num);
}
}
void MainWindow::on_nine_clicked()
{
cont++;
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 9;
ui->evaDisplay->display(num);
}
}
void MainWindow::on_zero_clicked()
{
if(cont < 10)
{
int num = ui->evaDisplay->value();
num = num * 10 + 0;
ui->evaDisplay->display(num);
if(num != 0)
{cont++;}
}
}
void MainWindow::on_clear_clicked()
{
ui->evaDisplay->display(0);
cont = 0;
}
void MainWindow::on_myAdd_clicked()
{
num1 = ui->evaDisplay->value();
on_clear_clicked();
res = 1;
}
void MainWindow::on_myDowns_clicked()
{
num1 = ui->evaDisplay->value();
on_clear_clicked();
res = 2;
}
void MainWindow::on_myBy_clicked()
{
num1 = ui->evaDisplay->value();
on_clear_clicked();
res = 3;
}
void MainWindow::on_myExcept_clicked()
{
num1 = ui->evaDisplay->value();
on_clear_clicked();
res = 4;
}
void MainWindow::on_moreThan_clicked()
{
num1 = ui->evaDisplay->value();
on_clear_clicked();
res = 5;
}
void MainWindow::on_result_clicked()
{
switch (res)
{
case 1:
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 + num2);
break;
case 2:
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 - num2);
break;
case 3:
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 * num2);
break;
case 4:
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 / num2);
break;
case 5:
num2 = ui->evaDisplay->value();
ui->evaDisplay->display(num1 % num2);
break;
}
}
void MainWindow::on_point_clicked()
{
int num = ui->evaDisplay->value();
cont = 0;
ui->evaDisplay->display(num / 10);
num /= 10;
while(num != 0)
{
num /= 10;
cont++;
//qDebug() << cont;
}
}