QT/C++开发简易计算器教程
最近学习qt,于是就随便做了一个简易的计算器(只支持鼠标点击)
1、使用qt creator设计计算器界面如图,使用右边的属性栏可以编辑窗口内的字体大小以及样式,并且为每个按钮设置相应的名称(如数字0-9使用Num0-Num9代表)
2、定义操作数和运算符(左操作数、运算符、右操作数)
QString num1;//定义左操作数
QString num2;//定义右操作数
QString op;//运算符
3、定义按钮类型
enum Btntype{//枚举按钮类型
Num,//数字型
Op,//操作符
Dot,//点
Equal,//等于
Clear,//清除
Back//退格
};
4、初始化文本框及绑定按钮槽函数
ui->lineEdit->setText("0");//初始化计算窗口,将窗口置0
//绑定数字按钮
connect(ui->Num0,&QPushButton::clicked,[this](){OnClicked(Num,"0");});
connect(ui->Num1,&QPushButton::clicked,[this](){OnClicked(Num,"1");});
connect(ui->Num2,&QPushButton::clicked,[this](){OnClicked(Num,"2");});
connect(ui->Num3,&QPushButton::clicked,[this](){OnClicked(Num,"3");});
connect(ui->Num4,&QPushButton::clicked,[this](){OnClicked(Num,"4");});
connect(ui->Num5,&QPushButton::clicked,[this](){OnClicked(Num,"5");});
connect(ui->Num6,&QPushButton::clicked,[this](){OnClicked(Num,"6");});
connect(ui->Num7,&QPushButton::clicked,[this](){OnClicked(Num,"7");});
connect(ui->Num8,&QPushButton::clicked,[this](){OnClicked(Num,"8");});
connect(ui->Num9,&QPushButton::clicked,[this](){OnClicked(Num,"9");});
//绑定运算符按钮
connect(ui->Sum,&QPushButton::clicked,[this](){OnClicked(Op,"+");});
connect(ui->Sub,&QPushButton::clicked,[this](){OnClicked(Op,"-");});
connect(ui->Mul,&QPushButton::clicked,[this](){OnClicked(Op,"×");});
connect(ui->Div,&QPushButton::clicked,[this](){OnClicked(Op,"/");});
//绑定其他按钮
connect(ui->Back,&QPushButton::clicked,[this](){OnClicked(Back,"Back");});
connect(ui->Clear,&QPushButton::clicked,[this](){OnClicked(Clear,"Clear");});
connect(ui->Dot,&QPushButton::clicked,[this](){OnClicked(Dot,".");});
connect(ui->Equal,&QPushButton::clicked,[this](){OnClicked(Equal,"=");});
5、槽函数定义以及实现槽函数
void Widget::OnClicked(Btntype _type,QString _btn){
switch (_type) {//按钮类型
case Num:
{
if(op.isEmpty())//如果运算符为空,则说明是操作数一
{
num1 += _btn;
}
else //如果运算符不为空,则说明是操作数二
{
num2 += _btn;
}
break;
}
case Op://操作符
{
if(num1.isEmpty()) return;
if(!num1.isEmpty() && !num2.isEmpty() && !op.isEmpty()){
double Num1=num1.toDouble();//转换为小数
double Num2=num2.toDouble();
double result=0.0;
if(op=="+"){
result = Num1 + Num2;
}else if (op=="-") {
result = Num1 - Num2;
}else if (op=="×") {
result = Num1 * Num2;
}else if (op=="/") {//注意操作数二不能为0
if(Num2==0.0){
ui->lineEdit->setText("除数不能为0!");
return;
}else {
result = Num1 / Num2;
}
}
ui->lineEdit->setText(QString::number(result));//将数字转换为字符串
num1 = QString::number(result);//将计算结果作为左操作数
num2.clear();//清空右操作数
}
op = _btn;
break;
}
case Clear://清除
{
num1.clear();
op.clear();
num2.clear();
break;
}
case Dot://点
{
if(op.isEmpty())//操作数一的小数点
{
if(!num1.isEmpty() && !num1.contains(".")){
num1 += _btn;
}
}
else {//操作数二的点
if(!num2.isEmpty() && !num2.contains(".")){
num2 += _btn;
}
}
break;
}
case Back:
{
if(!num1.isEmpty() && !num2.isEmpty() && !op.isEmpty()){
num2.chop(1);//尾部删除1位
}else if(!num1.isEmpty() && !op.isEmpty()){
op.chop(1);//尾部删除1位
}else if(!num1.isEmpty()){
num1.chop(1);//尾部删除1位
}
break;
}
case Equal://等于
{
if(num1.isEmpty() || num2.isEmpty() ||op.isEmpty()) return;
double Num1=num1.toDouble();//转换为小数
double Num2=num2.toDouble();
double result=0.0;
if(op=="+"){
result = Num1 + Num2;
}else if (op=="-") {
result = Num1 - Num2;
}else if (op=="×") {
result = Num1 * Num2;
}else if (op=="/") {//注意操作数二不能为0
if(Num2==0.0){
ui->lineEdit->setText("除数不能为0!");
return;
}else {
result = Num1 / Num2;
}
}
ui->lineEdit->setText(QString::number(result));//将数字转换为字符串
num1.clear();
op.clear();
num2.clear();
return;
}
}
ui->lineEdit->setText(num1 + op +num2);
if(ui->lineEdit->text().isEmpty()) ui->lineEdit->setText("0");
}
6、还可以为项目添加额外样式表(.qss文件,与css文件基本相同)
QPushButton{
background-color:rgba(0,0,0,0);
}
QPushButton:hover{
background-color:#f1e29c;
border-radius:5px;
}
QLineEdit{
border:2px solid #a18f38;
padding-top:45px;
color:#000;
}
7、导入样式表函数
QString initStyle(QString path){
QFile qss(path);
if( qss.open(QFile::ReadOnly))
{
qDebug("open success");
QString style = QLatin1String(qss.readAll());
qss.close();
return style;
}
else
{
qDebug("Open failed");
}
}
8、在main函数中调用导入样式表函数以及实例化计算器
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setStyleSheet(initStyle(":/source/Caculater.qss"));
Widget w;
w.show();
return a.exec();
}
9、运行展示
项目源码已上传