QT创建计算器 [数据库实验课]
前言
qt我没有系统的学习过,所以对很多细节都很不清楚,今天写这个计算器,遇到了好多问题。
问题
上课的时候老师做c#示例的时候,老师是在每一个0~9的按钮里,都双击添加函数的,然后我就想到当时写Java计算器的时候,是有一个函数,每个按钮都是在那个重写的函数里先判断id再进行的。我就思考如何在qt里面对同一组功能的btn实现像Java里那样的写法(对功能相似的按钮,这样写法更为简洁)。
-
如何让.cpp里的变量和ui里的组件通过循环关联起来
对于这个计算器来说,为了方便布局,我们把按钮都在ui拖拽了出来,那么他如何和cpp里的变量关联(当然直接相等就可以,我的意思是在好多按钮的情况下,如何用循环来使他们关联)。
比如说ui里有btn1 btn2 btn3 …btn9几个按钮,如何在cpp里通过循环让他们赋值给btnlist[]
解决
findChild函数
实例:
this->findChild<QPushButton*>("btn"+QString::number(i));
-
如何让几个btn执行一个槽函数(根据不用的btn分别执行不同的命令)
把一组相同功能的按钮添加一个槽函数,不用每个按钮都写一个槽函数,虽然lambda表达式很好用。就比如按钮0~9,他们的功能不能说差不多,只能说完全一样(当然根据不同的id是不一样的数字)
解决
首先有QSignalMapper类,但是好像官方建议用lambda替代这个类。。。
然后是通过objectname判断,这个就很像Java了
实例:
QString btnname=QObject::sender()->objectName();
-
若干转换及常用函数
num->QString QString里的静态函数 number()
QString里的substr str.mid(idx,n)//从idx开始n个字符
QString [] at 前者返回的是QCharRef 后者是QChar
Qstring ->num str.toDouble …
QMessageBox 主要用到里面的静态函数
QChar->QString QString(qchar)
正文开始
逻辑还算比较好写,设置 leftnum,rightnum,flag,afterComputing四个变量
(afterComputing用来标识是否刚进行了一次运算,如果是的话,现在按数字按钮会先行清空label)
实例:
我们输入0.125
我们按下1/X
我们按下sqrt(X)
我们按下+/-
我们按下CE
别的就不一一举例了
主要代码(mainwindow.cpp)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QString>
#include<QDebug>
#include<cmath>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
this->setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);// 窗体不能变化
ui->setupUi(this);
this->ui->label->setText("0");
this->setWindowTitle("计算器_liang");
//数字按钮们
for(int i=0;i<10;++i)
connect(this->findChild<QPushButton*>("btn"+QString::number(i)),QPushButton::clicked,this,btn_num_clicked);
//按钮CE
connect(this->ui->btnce,QPushButton::clicked,this,[=]
{
this->ui->label->setText("0");
flag="";
});
//按钮Clear One
connect(this->ui->btnco,QPushButton::clicked,this,[=]
{
QString text=this->ui->label->text();
if(text.size()==1) text="0";
else text=QString(text.mid(0,text.size()-1));
this->ui->label->setText(text);
});
//按钮1/X sqrt(X) X2 +/-
connect(this->ui->btnre,QPushButton::clicked,this,btn_singlefunc_clicked);
connect(this->ui->btnsqrt,QPushButton::clicked,this,btn_singlefunc_clicked);
connect(this->ui->btnsquare,QPushButton::clicked,this,btn_singlefunc_clicked);
connect(this->ui->btninv,QPushButton::clicked,this,btn_singlefunc_clicked);
//按钮+ - * / =
connect(this->ui->btnadd,QPushButton::clicked,this,btn_doublefunc_clicked);
connect(this->ui->btnminus,QPushButton::clicked,this,btn_doublefunc_clicked);
connect(this->ui->btnmultply,QPushButton::clicked,this,btn_doublefunc_clicked);
connect(this->ui->btndivide,QPushButton::clicked,this,btn_doublefunc_clicked);
connect(this->ui->btnequal,QPushButton::clicked,this,btn_doublefunc_clicked);
//按钮 .
connect(this->ui->btndot,QPushButton::clicked,this,[=]
{
QString text=this->ui->label->text();
if(text.size()==0)
text="0.";
else if(text.at(text.size()-1)!='.')
text+=".";
this->ui->label->setText(text);
});
}
//按钮0~9
void MainWindow::btn_num_clicked()
{
//如果刚刚算完数的话,再按数字,就先清空
if(afterComputing)
{
this->ui->label->setText("");
afterComputing=false;
}
QString btnname=QObject::sender()->objectName();
QString num=btnname.at(btnname.size()-1);
QString text=this->ui->label->text();
if(text=="0") this->ui->label->setText(num);
else this->ui->label->setText(text+num);
}
//按钮1/X sqrt(X) X2 +/-
void MainWindow::btn_singlefunc_clicked()
{
double num=this->ui->label->text().toDouble();
QString btnname=QObject::sender()->objectName();
if(btnname=="btnre")
{
if(num!=0) num=1.0/num;
}
else if(btnname=="btnsqrt")
num=sqrt(num);
else if(btnname=="btnsquare")
num*=num;
else if(btnname=="btninv")
num*=-1;
afterComputing=true;
this->ui->label->setText(QString::number(num));
}
// + - * / =
void MainWindow::btn_doublefunc_clicked()
{
double num=this->ui->label->text().toDouble();
QString btnname=QObject::sender()->objectName();
if(btnname=="btnadd")
{
flag="+";
leftnum=num;
this->ui->label->setText("0");
}
else if(btnname=="btnminus")
{
flag="-";
leftnum=num;
this->ui->label->setText("0");
}
else if(btnname=="btnmultply")
{
flag="*";
leftnum=num;
this->ui->label->setText("0");
}
else if(btnname=="btndivide")
{
flag="/";
leftnum=num;
this->ui->label->setText("0");
}
else if(btnname=="btnequal")
{
afterComputing=true;
rightnum=num;
if(flag=="+")
num=leftnum+rightnum;
else if(flag=="-")
num=leftnum-rightnum;
else if(flag=="*")
num=leftnum*rightnum;
else if(flag=="/")
{
if(rightnum!=0)
num=leftnum/rightnum;
else
QMessageBox::warning(this,"警告","除数不能是0!");
}
this->ui->label->setText(QString::number(num));
}
}
MainWindow::~MainWindow()
{
delete ui;
}