Qt实现计算器
一、前景介绍
目前这个计算器只实现了简单的加减乘除。
缺点:
- 没有实现连续加减乘除功能
- 结果数值较长,无法全部显示
- 计算完一次,需要清除一次(点击C)。
二、效果图
三、代码
1、mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QAbstractButton>
#include<QVector>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void initUI();
public slots:
void onButtonGroupClicked(QAbstractButton *btn);
private:
Ui::MainWindow *ui;
QVector<QVariant>vec; //用来保存输入的东西
QString prevBtn; //用来保存上一次输入的东西
};
#endif // MAINWINDOW_H
2、main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
3、mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QButtonGroup>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
initUI();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initUI()
{
//1、把所有的按钮放到一个按钮组里面
auto buttonGroup=new QButtonGroup(this);
auto btnList=findChildren<QPushButton*>();
for(auto btn:btnList)
{
buttonGroup->addButton(btn);
}
//2、关联按钮组的点击信号
void(QButtonGroup:: *f)(QAbstractButton*)=&QButtonGroup::buttonClicked;
connect(buttonGroup,f,this,&MainWindow::onButtonGroupClicked);
vec.resize(5);
}
void MainWindow::onButtonGroupClicked(QAbstractButton *btn)
{
double val=ui->le_show->text().toDouble();
QString name=btn->text();
//如果是数字,直接显示出来
if((name>="0"&&name<="9")||(name=="."))
{
if(ui->le_show->text()=="0"&&name!=".")
{
ui->le_show->clear();
}
//如果我点击数字的时候,输入框有值,则清空再显示我输入的值
if(prevBtn=="+"||prevBtn=="-"||prevBtn=="÷"||prevBtn=="×")
{
ui->le_show->clear();
}
ui->le_show->insert(name);
}
else if(name=="+")
{
//左操作数已输完,防止连续输入多个操作符
if(vec[2].isNull())
{
//把左操作数存起来
vec[0]=val;
vec[1]="+";
}
}
else if(name=="-")
{
//左操作数已输完,防止连续输入多个操作符
if(vec[2].isNull())
{
//把左操作数存起来
vec[0]=val;
vec[1]="-";
}
}
else if(name=="÷")
{
//左操作数已输完,防止连续输入多个操作符
if(vec[2].isNull())
{
//把左操作数存起来
vec[0]=val;
vec[1]="÷";
}
}
else if(name=="×")
{
//左操作数已输完,防止连续输入多个操作符
if(vec[2].isNull())
{
//把左操作数存起来
vec[0]=val;
vec[1]="×";
}
}
else if(name=="=")
{
//保存右操作数
vec[2]=val;
vec[3]="=";
if(vec[1]=="+")
{
vec[4]=vec[0].toDouble()+vec[2].toDouble();
}
else if(vec[1]=="-")
{
vec[4]=vec[0].toDouble()-vec[2].toDouble();
}
else if(vec[1]=="×")
{
vec[4]=vec[0].toDouble()*vec[2].toDouble();
}
else if(vec[1]=="÷")
{
vec[4]=vec[0].toDouble()/vec[2].toDouble();
}
ui->le_show->setText(vec[4].toString());
}
else if(name=="C")
{
ui->le_show->clear();
ui->le_process->clear();
vec.clear();
vec.resize(5);
}
else if(name=="CE")
{
ui->le_show->clear();
}
else if(name=="del")
{
//先前移一个位置的光标
ui->le_show->setCursorPosition( ui->le_show->cursorPosition()-1);
ui->le_show->del();
}
ui->le_process->clear();
for(auto var:vec){
ui->le_process->insert(var.toString());
}
prevBtn=name;
}
4、ui设计界面
自己设计即可。
四、下载源代码/可运行程序
参考文献
B站—Qt项目实战教程:qt还原Windows计算器!漂亮的界面,加上好玩的逻辑,学习编程也可以非常有趣! --爱编程的可达鸭