头文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QGridLayout>
#include <QDebug>
#include <QString>
#include <QStringList>
#include <QFont>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private slots:
void number_clicked();
void expr_clicked();
void point_clicked();
void chop_clicked();
void clear_clicked();
void equal_clicked();
private:
QLineEdit *le;
QPushButton *pb[18];
double num1,num2,num;//结果,左值,右值
char expr;
};
#endif // WIDGET_H
cpp文件:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QFont font ("Times", 30, QFont::Bold);//设置字体
this->setFont(font); //应用到全部
le=new QLineEdit("0");
le->setAlignment(Qt::AlignRight);//设置行编辑器为右对齐
QStringList list ={"0","1","2","3","4","5","6","7","8",\
"9",".","/","*","-","+","<-","C","="};
for(int i=0;i<18;i++)
{
pb[i]= new QPushButton(list.at((i)));//初始化按钮,at表示取字符串的第几个参数
}
pb[17]->setFixedHeight(130);//设置等号按钮的高度
QFont font1 ("Times", 50, QFont::Bold);//设置字体
pb[17]->setFont(font1); //应用到等号
QGridLayout *gbox = new QGridLayout;
gbox->addWidget(le,0,0,1,5);
gbox->addWidget(pb[7],1,0,1,1);
gbox->addWidget(pb[8],1,1,1,1);
gbox->addWidget(pb[9],1,2,1,1);
gbox->addWidget(pb[11],1,3,1,1);// /
gbox->addWidget(pb[15],1,4,1,1);//<-
gbox->addWidget(pb[4],2,0,1,1);
gbox->addWidget(pb[5],2,1,1,1);
gbox->addWidget(pb[6],2,2,1,1);
gbox->addWidget(pb[12],2,3,1,1);// *
gbox->addWidget(pb[16],2,4,1,1);//C
gbox->addWidget(pb[1],3,0,1,1);
gbox->addWidget(pb[2],3,1,1,1);
gbox->addWidget(pb[3],3,2,1,1);
gbox->addWidget(pb[13],3,3,1,1);// -
gbox->addWidget(pb[17],3,4,2,1);//=
gbox->addWidget(pb[0],4,0,1,2);
gbox->addWidget(pb[10],4,2,1,1);//.
gbox->addWidget(pb[14],4,3,1,1);//+
setLayout(gbox);
for(int i=0;i<10;i++)//数子
{
connect(pb[i],SIGNAL(clicked(bool)),this,SLOT(number_clicked()));
}
for(int i=11;i<15;i++) //运算符
{
connect(pb[i],SIGNAL(clicked(bool)),this,SLOT(expr_clicked()));
}
connect(pb[10],SIGNAL(clicked(bool)),this,SLOT(point_clicked()));//.
connect(pb[15],SIGNAL(clicked(bool)),this,SLOT(chop_clicked()));//<-
connect(pb[16],SIGNAL(clicked(bool)),this,SLOT(clear_clicked()));//C
connect(pb[17],SIGNAL(clicked(bool)),this,SLOT(equal_clicked()));//=
num=num1=num2=0;
expr='#';
}
Widget::~Widget()
{
}
void Widget::number_clicked()
{
//sender()通过谁产生信号进入的槽函数
//通过强制类型转换,转换成对应的派生类对象
QPushButton *pbb = static_cast<QPushButton *> (sender());//谁产生的信号
//dynamic_cast
//int n = pdd->text().toInt();//获取按钮上的文字并转换成整数
QString str1 = pbb->text();
QString str =le->text();
if("0"==str) //避免出现01,这种0开头的数字
{
le->setText(str1);
}
else
le->setText(str+str1);
}
void Widget::expr_clicked()
{
if('#'!=expr)//避免连续点击多次运算符
return;
QPushButton *pbb = static_cast<QPushButton *> (sender());
QString str = pbb->text();
expr=str.at(0).toLatin1();//把字符串去第一个字符Qchar,再转换成char类型
num1=le->text().toDouble();//保存左值
le->setText("0"); //此时可以输入第二个数字
}
void Widget::point_clicked()
{
QString str=le->text();
if(-1!=str.indexOf('.'))//查找字符的位置,找不到返回-1
return ;
le->setText(str+'.');//如果没有. ,加上点在运行
}
void Widget::chop_clicked()//删除一个
{
QString str=le->text();
if(1==str.length()) //只有一个数字时,删除完要显示0
le->setText("0");
else
{
str.chop(1);//去掉字符串最后一个元素
le->setText(str);
}
}
void Widget::clear_clicked()
{
expr='#';
num=num1=num2=0;
le->setText("0");
}
void Widget::equal_clicked()
{
if('#'==expr)//避免连续点击
return;
num2 = le->text().toDouble();
switch(expr)
{
case '+':
num=num1+num2;
break;
case '-':
num=num1-num2;
break;
case '*':
num=num1*num2;
break;
case '/':
if(0==num2)
{
clear_clicked();
return;
}
num=num1/num2;
break;
}
le->setText(QString::number(num));
expr='#';
num=num1=num2=0;
}