Qt实现一个简单的计算器

简介: 运行效果:输入num1和num2选择+-*/点击计算即可

一、UI界面版


运行效果:输入num1和num2选择+-*/点击计算即可


1.png

UI界面设计


3个lineEdit(lineEditNum1,lineEditNum2,lineEditSum)

2个PushButton(buttonClear,ButtonCalc)

1个comboBox

1个label


布局


3个lineEdit和1个comboBox、1个label水平布局

2个PushButton和一个弹簧水平布局

最后整体布局即可


2.png


main.cpp


#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}


mainwindow.cpp


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_buttonCalc_clicked()
{
    double num1 = ui->lineEditNum1->text().toDouble();//获取num1的值
    double num2 = ui->lineEditNum2->text().toDouble();//获取num2的值
    uint8_t index = ui->comboBox->currentIndex();   //获取下拉框的下标0 +, 1 - ,2 *, 3 /
    double result = 0.0;
    switch (index) {
    case 0:
        result = num1 + num2;
        break;
    case 1:
        result = num1 - num2;
        break;
    case 2:
        result = num1 * num2;
        break;
    case 3:
        if(num2 == 0)
        {
            QMessageBox::about(this,"注意","除数不能为0");
            return;
        }
        result = num1 / num2;
        break;
    default:
        break;
    }
    ui->lineEditSum->setText(QString::number(result));
}
void MainWindow::on_buttonClear_clicked()
{
    ui->lineEditNum1->clear();
    ui->lineEditNum2->clear();
    ui->lineEditSum->clear();
}


mainwindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_buttonCalc_clicked();//计算结果槽函数
    void on_buttonClear_clicked();//清除输入框槽函数
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H


二、纯代码版


注:只能两个数单独加减乘除,不能连续运算,按‘ = ’重新开始两个数运算


3.png


main.cpp


#include "calc.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Calc w;
    w.show();
    return a.exec();
}


calc.cpp


#include "calc.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QSizePolicy>
#include <QDebug>
Calc::Calc(QWidget *parent) :
    QWidget(parent)
{
    //获取字体QFont
    QFont font = this->font();
    font.setPixelSize(30);
    this->setFont(font);
    //保存键盘值
    QString keys="789-456*123/0.+=";
    QVBoxLayout *vbox = new QVBoxLayout();
    QSizePolicy qsPolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    for(int i=0; i<4; i++)
    {
        QHBoxLayout *hbox = new QHBoxLayout();
        for(int j=0; j<4; j++)
        {
            buttons[i*4+j] = new QToolButton(this);
            //设置文本
            buttons[i*4+j]->setText(keys.mid(i*4+j, 1));
            hbox->addWidget(buttons[i*4+j]);
            //策略设置
            buttons[i*4+j]->setSizePolicy(qsPolicy);
            //把按钮触发信号关联槽函数
            connect(buttons[i*4+j], SIGNAL(clicked(bool)),this, SLOT(buttons_chick()));
        }
        //把水平布局管理器添加到垂直布局管理器中
        vbox->addLayout(hbox);
    }
    //创建一个输入框
    edit = new QLineEdit(this);
    edit->setSizePolicy(qsPolicy);
    edit->setMaximumHeight(60);
    edit->setAlignment(Qt::AlignRight);
    QVBoxLayout *allVbox = new QVBoxLayout(this);
    allVbox->addWidget(edit);
    allVbox->addLayout(vbox);
    //初始化
    firstNumber.clear();
    secondNumber.clear();
    calcflag = 0;
}
Calc::~Calc()
{
}
void Calc::input_data(QString str)
{
    if(calcflag == 0)
    {
        firstNumber.append(str);
        edit->setText(firstNumber);
    }else
    {
        secondNumber.append(str);
        edit->setText(secondNumber);
    }
}
void Calc::buttons_chick()
{
    //通过信号发送者获取按钮对象
    QToolButton *button = (QToolButton*)sender();
    //qDebug()
    QString str = button->text();
    QString datastr = ".0123456789";
    QStringList typestr;
    typestr<<"+"<<"-"<<"*"<<"/";
    if(datastr.indexOf(str) >= 0)//获取按键值
    {
        input_data(str);    //输入数据
    }else if(typestr.indexOf(str)>=0)
    {
        calcflag = typestr.indexOf(str)+1;//获取运算符号type
    }else //=
    {
        double result = 0.0;
        switch (calcflag) {
        case 1:
            result = firstNumber.toDouble()+secondNumber.toDouble();
            break;
        case 2:
            result = firstNumber.toDouble()-secondNumber.toDouble();
            break;
        case 3:
            result = firstNumber.toDouble()*secondNumber.toDouble();
            break;
        case 4:
            result = firstNumber.toDouble()/secondNumber.toDouble();
            break;
        default:
            break;
        }
        edit->setText(QString::number(result));
        calcflag = 0;
        firstNumber.clear();
        secondNumber.clear();
    }
}


calc.h


#ifndef CALC_H
#define CALC_H
#include <QWidget>
#include <QToolButton>
#include <QLineEdit>
class Calc : public QWidget
{
    Q_OBJECT
public:
    explicit Calc(QWidget *parent = 0);
    ~Calc();
    void input_data(QString str);
protected slots:
    void buttons_chick();//按键槽函数
private:
    QToolButton *buttons[16];   //按钮数组
    QLineEdit *edit;            //输入框
    QString firstNumber;        //记录输入第一个数值
    QString secondNumber;       //记录输入第一个数值
    int calcflag;               //1-add, 2-sub, 3-mul, 4-div
};
#endif // CALC_H


如果你觉得文章还不错,记得"点赞关注"


关注我的微信公众号【 加班猿 】可以获取更多内容

目录
相关文章
|
C++
基于Qt的简易计算器设计与实现
基于Qt的简易计算器设计与实现
830 0
|
存储 算法 C++
【Qt应用开发】复刻经典:基于Qt实现Windows风格计算器(加减乘除、删除、归零功能全解析)
在Qt中,"栈"的概念主要体现在两个层面:一是程序设计中的数据结构——栈(Stack),二是用户界面管理中的QStackedWidget控件。下面我将分别简要介绍这两个方面:
527 4
|
C++ Windows
第1个Qt项目:计算器
第1个Qt项目:计算器
381 1
第1个Qt项目:计算器
|
存储 索引
“QT 快速上手指南“ 之 计算器(三)信号与槽,connect 函数,QString
QT 中 信号 与 槽机制(Signal and Slot)是QT GUI 编程中的一项非常强大的功能。简单来说,它是一种事件处理机制,可以实现类与类之间的通信,并且可以解耦合应用程序。本文将对QT中信号与槽的详细使用方法做出介绍。
369 0
|
容器
“QT 快速上手指南“ 之 计算器(二)组件,坐标,窗口
“QT 快速上手指南“ 之 计算器(二)组件,坐标,窗口
337 0
|
开发框架 数据可视化 IDE
“QT快速上手指南”之计算器(一)Qt Creator,窗口组件
从这篇文章开始,我们开始学习 QT 的知识,首先 我们先开始做一个小项目,制作一个计算器。 本教程是在 Windows 下来实现该项目,具备计算器的一些基础功能。
428 0
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
573 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
736 0
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
1026 2