计算器qt小项目,简单。
这几天准备学习下QT,都说QT比MFC容易上手很多,所以刚装好QT5.9.8,上网查资料编写了一个简单的计算器小项目,在这里留下编写过程,算是刚接触QT的一点心得吧,通过此小项目发现QT确实比MFC好用,编程过程会实时提示你的编程错误,软件启动和运行速度都很快,最重要的界面布局和信号连接比较方便。计算器效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190628133029850.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTkxMjk1,size_16,color_FFFFFF,t_70)
编写过程大致按如下步骤,首先第一步,在QTCreator中新建一个Qt widgets Application , 在基类选择页面选QWidget,其他都选择默认即可。
第二步,需求分析:需要十八个按键(push button),分别为0 1 2 3 4 5 6 7 8 9 . + - * / C 退格 ,来输入需要的数据和需要进行的操作,还需要一个显示框(Line edit)来显示结果,布局如第一幅图所示,可更具个人喜好更改颜色布局等。设置对应控件 的objectname和Text,如下表所示:
第三步:编程分析用到的函数有
1连接函数:例connect(ui->pushButton0,SIGNAL(clicked(bool)),this,SLOT(item0()));表示将按键0与item()函数连接起来。
2获取按键的text的函数:例item_0 = ui->pushButton0->text();表示将按键0的text存储在字符串item_0中。
3字符显示函数:例ui->lineEdit->setText(line); //表示将字符串line显示在显示框lineEdit中
过程大致就是
我们定义10个字符串来存储对应按键输入的数字,如下:
QString item_0; //0
QString item_1; //1
QString item_2; //2
QString item_3;//3
QString item_4;//4
QString item_5;//5
QString item_6;//6
QString item_7;//7
QString item_8;//8
QString item_9;
然后定义两个存放需要进行加减等操作的字符串,用来存储需要进行运算的两个数的字符串值
QString temp1,temp2;
然后定义浮点型变量,用来存储最后的输出结果
double sum = 0;
再定义7个整形变量,作为不同状态的标志符,如下:
int flag = 0 ;//flag加号标志,
int flag1 = 0; flag1等于号标志
int flag3 = 0;//减号标志
int flag4 = 0;//乘号标志
int flag5 = 0;//除号标志
int flag6 = 0; //下一次运算开始标志
最后定义字符串line,用于实时显示当前输入或者计算结果
QString line;
下面我们以计算66*88=5808看一下具体的运算过程
首先按6,则按键6对应的槽函数item6()会将按键6的text值6赋给字符串item_6 ,然后将item6的值赋给需要显示的字符串line,当再按一次6时,同样将按键6的text值6赋给字符串item_6,并将item_6的值串接在字符串line的后面,此时line值为“66”。
然后按下乘号键,此时乘号键的槽函数mul()首先将乘号运算标志flag5置为1,即flag5=1;然后将line中已有的需要运算的第一个数存在字符串temp1中,并将乘号“”的字符串值串接在line中显示,此时line值为66。
然后同理按下88,按键8的槽函数item6()按与按键6的槽函数相同规则进行处理,此时显示字符串line的值变为6688
再按下等号键=,等号键的槽函数equal() 首先将=串接在line中,此时line的值为6688=,然后查看标识符,看是什么运算,查到flag5=1,断定是运算。再检测字符串line中 * 和=之间的字符,检测到为88,并将检测结果赋给第二个存储运算变量的字符串temp2, 此时temp2的值应为“88”。
然后将temp1和temp2中的数转换成浮点型,并执行标志flag5对应的乘运算,将结果赋给浮点型变量num,此时num值为5808。执行语句为 sum = temp1.toDouble() + temp2.toDouble(); //将字符转换成浮点型
最后将num的值转为字符串,并串接在line后面显示,此时line的值为“6688=5808”,执行语句为 line=line+QString::number(sum); ui->lineEdit->setText(line);
最最后,将一次运算完成标志flag6置为1,之后按0~9之间的任何数时,会将其当做一次重新的计算,并把line,temp1,temp2中的值都清空。
以上就是一次完整的运算过程,其他运算与此类似。
第四步:具体实现过程
**一:**首先在widget.h头文件中的private slots下加入你的十八个按键对应的草函数名称,如下:
void item0();//0
void item1();//1
void item2();//2
void item3();//3
void item4();//4
void item5();//5
void item6();//6
void item7();//7
void item8();//8
void item9();//9
void sub();//减号
void div();//除号
void mul();//乘号
void cancel();//取消
void delet();//尾剔除
void add();//加号
void equal();//等于号
void point();//小数点
二:然后在widget.cpp中的
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
这里加…
}
加入每个按键信号和对应的槽函数连接的连接函数,检测到click(bool)信号时执行对应的槽函数,加入内容如下:
connect(ui->pushButton0,SIGNAL(clicked(bool)),this,SLOT(item0())); //0
connect(ui->pushButton1,SIGNAL(clicked(bool)),this,SLOT(item1())); //1
connect(ui->pushButton2,SIGNAL(clicked(bool)),this,SLOT(item2())); //2
connect(ui->pushButton3,SIGNAL(clicked(bool)),this,SLOT(item3())); //3
connect(ui->pushButton4,SIGNAL(clicked(bool)),this,SLOT(item4())); //4
connect(ui->pushButton5,SIGNAL(clicked(bool)),this,SLOT(item5())); //5
connect(ui->pushButton6,SIGNAL(clicked(bool)),this,SLOT(item6())); //6
connect(ui->pushButton7,SIGNAL(clicked(bool)),this,SLOT(item7())); //7
connect(ui->pushButton8,SIGNAL(clicked(bool)),this,SLOT(item8())); //8
connect(ui->pushButton9,SIGNAL(clicked(bool)),this,SLOT(item9())); //9
connect(ui->pushButton_c,SIGNAL(clicked(bool)),this,SLOT(cancel()));//取消
connect(ui->pushButton_add,SIGNAL(clicked(bool)),this,SLOT(add()));//加号
connect(ui->pushButton_equal,SIGNAL(clicked(bool)),this,SLOT(equal()));//等于号
connect(ui->pushButton_point,SIGNAL(clicked(bool)),this,SLOT(point()));//小数点
connect(ui->pushButton_div,SIGNAL(clicked(bool)),this,SLOT(div()));//除号
connect(ui->pushButton_sub,SIGNAL(clicked(bool)),this,SLOT(sub()));//减号
connect(ui->pushButton_mul,SIGNAL(clicked(bool)),this,SLOT(mul()));//乘号
connect(ui->pushButton_delete,SIGNAL(clicked(bool)),this,SLOT(delet()));//尾剔除
最后在刚才那个函数,即:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
已加入连接函数;
}的后面加入运算代码,如下:
QString line;
QString item_0; //0
QString item_1; //1
QString item_2; //2
QString item_3;//3
QString item_4;//4
QString item_5;//5
QString item_6;//6
QString item_7;//7
QString item_8;//8
QString item_9;//9
QString temp1,temp2; //临时存放两次输入的要进行计算的项
double sum = 0; //计算后的结果
int flag = 0,flag1 = 0; //flag加号标志,flag1等于号标志
int flag3 = 0;//减号标志
int flag4 = 0;//乘号标志
int flag5 = 0;//除号标志
int flag6 = 0; //下一次运算开始标志
Widget::~Widget()
{
delete ui;
}
void Widget::item0() //0
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_0 = ui->pushButton0->text(); //获取按键中的字符"0"
line += item_0;//每按一次按键就相加一次按键中的字符"0"
ui->lineEdit->setText(line); //显示到输入条中
}
void Widget::item1() //1
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_1 = ui->pushButton1->text();
line += item_1;
ui->lineEdit->setText(line);
}
void Widget::item2() //2
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_2 = ui->pushButton2->text(); //获取按键中的字符"2"
line += item_2; //每按一次按键就相加一次按键中的字符"2"
ui->lineEdit->setText(line);
}
void Widget::item3() //3
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_3 = ui->pushButton3->text(); //获取按键中的字符"3"
line += item_3; //每按一次按键就相加一次按键中的字符"3"
ui->lineEdit->setText(line);
}
void Widget::item4() //4
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_4 = ui->pushButton4->text();
line += item_4;
ui->lineEdit->setText(line);
}
void Widget::item5() //5
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_5 = ui->pushButton5->text();
line += item_5;
ui->lineEdit->setText(line);
}
void Widget::item6() //6
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_6 = ui->pushButton6->text();
line += item_6;
ui->lineEdit->setText(line);
}
void Widget::item7() //7
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_7 = ui->pushButton7->text();
line += item_7;
ui->lineEdit->setText(line);
}
void Widget::item8() //8
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_8 = ui->pushButton8->text();
line += item_8;
ui->lineEdit->setText(line);
}
void Widget::item9() //9
{
if(flag6==1)
{
flag6=0;
line.clear();
temp1.clear();
temp2.clear();
}
item_9 = ui->pushButton9->text();
line += item_9;
ui->lineEdit->setText(line);
}
void Widget::point() //小数点
{
if(flag1 == 0)
{
line +=".";
ui->lineEdit->setText(line);
}
if(flag1 == 1)
{
line = ui->lineEdit->text();
line += ".";
ui->lineEdit->setText(line);
flag1 = 0;
}
}
void Widget::delet() //尾剔除
{
line = ui->lineEdit->text(); //获取输入条中的字符
line.chop(1); //倒位删除,即是从字符串后面开始按位删除
ui->lineEdit->setText(line);
}
void Widget::cancel() //重新置零
{
line.clear();
temp1.clear();
temp2.clear();
sum = 0;
flag = 0;
flag1 = 0;
flag3 = 0;
flag4 =0;
flag5 = 0;
ui->lineEdit->setText(line);//输出0
}
void Widget::add() //相加
{
flag = 1;
temp1 = ui->lineEdit->text(); //获取前面输入的字符并临时保存起来
line=temp1+"+";
ui->lineEdit->setText(line);
}
void Widget::sub() //相减
{
flag3 = 1;//按了加号按键就改变状态
temp1 = ui->lineEdit->text(); //获取前面输入的字符并临时保存起来
line=temp1+"-";
ui->lineEdit->setText(line);//显示清空状态
}
void Widget::div()//除法
{
flag4 = 1;//按了加号按键就改变状态
temp1 = ui->lineEdit->text(); //获取前面输入的字符并临时保存起来
line=temp1+"/";
ui->lineEdit->setText(line);//显示清空状态
}
void Widget::mul()//乘法
{
flag5 = 1;//按了加号按键就改变状态
temp1 = ui->lineEdit->text(); //获取前面输入的字符临时保存起来
line=temp1+"*";
ui->lineEdit->setText(line);//显示清空状态
}
void Widget::equal() //得出结果
{
flag1 = 1; //按一次等于号就改变状态
if(flag == 1) //加法
{
// temp2 = ui->lineEdit->text();
// line.clear(); //清空字符串
line= line+"=";
int b=100;
temp2.clear();
for(int a=0;a<line.size()-1;a++)
{
if(line[a]=="+")
b=a;
if(a>b)
temp2+=line[a];
}
sum = temp1.toDouble() + temp2.toDouble(); //将字符转换成浮点型
line=line+QString::number(sum);
ui->lineEdit->setText(line);
flag = 0; //重新让标志位置零,等待下一次的加法进行
flag6=1;
}
else if(flag3 == 1) //减法
{
line= line+"=";
int b=100;
for(int a=0;a<line.size()-1;a++)
{
if(line[a]=="-")
b=a;
if(a>b)
temp2=temp2+line[a];
}
// ui->lineEdit->setText(line);
sum = temp1.toDouble() - temp2.toDouble(); //将字符转换成浮点型
if(sum==0) //等于0
{
ui->lineEdit->setText("0");
}
line=line+QString::number(sum);
ui->lineEdit->setText(line);
flag3 = 0; //重新让标志位置零,等待下一次的减法进行
flag6=1;
}
else if(flag4 == 1) //除法
{
line= line+"=";
int b=100;
for(int a=0;a<line.size()-1;a++)
{
if(line[a]=="/")
b=a;
if(a>b)
temp2=temp2+line[a];
}
sum = temp1.toDouble() / temp2.toDouble(); //将字符转换成浮点型
if(temp2 == "0") //分母等于0
{
ui->lineEdit->setText("0");
}
line=line+QString::number(sum);
ui->lineEdit->setText(line);
flag4 = 0; //重新让标志位置零,等待下一次的除法进行
flag6=1;
}
else if(flag5 == 1) /`/`乘法
{
line= line+"=";
int b=100;
for(int a=0;a<line.size()-1;a++)
{
if(line[a]=="*")
b=a;
if(a>b)
temp2=temp2+line[a];
}
sum = temp1.toDouble() * temp2.toDouble(); //将字符转换成浮点型
line=line+QString::number(sum);
ui->lineEdit->setText(line);
flag5 = 0; //重新让标志位置零,等待下一次的乘法进行
flag6=1;
}
}
总结:如果你开始时的按键和显示框的objectname和text按上面的表格设置正确,程序按如上三步添加正确,编译运行后简单计算器就可以运行了。
最后附上一张西安美图,以供欣赏。