期末考试之后回家复习qt的相关知识,考虑先做一个简单的qt小demo,复习信号槽之类的,于是做了一个qt的简易计算器.
计算器只具有整数的加减乘除的基本功能,使用了LineEdit 和 pushButton ,简单易懂。
制作这个小demo的基本思路如下。
使用QT制作一个简易的计算器,点击数字和计算的符号进行运算。
这里直接在QT的UI界面对计算器进行界面绘制。
这里整个Widget使用垂直分布,上面使用LineEdit作为显示框,下面使用PushButton表示每一个按钮,下面的widget使用栅栏布局4*4
先对按钮进行绑定,这里为了避免代码的冗杂,封装了一个处理函数delNum对点击事件进行处理。
//绑定信号槽点击事件
// 按钮:事件的发起者 动作:点击 接收者 反应:调用处理函数
connect(ui->btn_n0,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_n1,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_n2,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_n3,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_n4,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_n5,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_n6,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_n7,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_n8,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_n9,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_denghao,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_chufa,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_chengfa,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_jiafa,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_jianfa,SIGNAL(pressed()),this,SLOT(dealNum()));
connect(ui->btn_x,SIGNAL(pressed()),this,SLOT(dealNum()));
dealNum函数如下:获取点击的内容,进行相应的操作,最后在显示部分进行显示 ,点击等号后便根据上面的运算符号进行计算。
void Widget:: dealNum(){
//获取信号的发送者
QPushButton * btn = (QPushButton *)this->sender();
//获取发送者按钮的内容
QString str = btn->text();
//首先考虑是不是退格键
if("X" == str){
//是 截掉最后一个字符
buf.chop(1);
}
else {
//不是 追加
buf += str;
// 运算操作
if("=" == str)
{ // 如果是 " = "
char str[100] = {0};
//使用 strcpy 函数将 buf 的内容转换为本地8位编码后复制到 str 中。
strcpy(str, buf.toLocal8Bit().data());
int a, b;
char c;
//使用 sscanf 函数从 str 中读取格式化的数据。
//123x456
//a = 123 c = x b =456
sscanf(str, "%d%c%d", &a, &c, &b);
if('+' == c)
{
buf = QString::number(a+b);
}
else if('-' == c)
{
buf = QString::number(a-b);
}
else if('*' == c)
{
buf = QString::number(a*b);
}
else if('/' == c){
buf = QString::number(a/b);
}
}
}
//将内容显示
ui->lineEdit->setText(buf);
}