乐趣区

关于qt5:Qt实现一个简单的计算器

Qt 实现一个简略的计算器

作者:hackett

微信公众号:加班猿

一、UI 界面版

运行成果:输出 num1 和 num2 抉择 +-*/ 点击计算即可

UI 界面设计:

3 个 lineEdit(lineEditNum1,lineEditNum2,lineEditSum)

2 个 PushButton(buttonClear,ButtonCalc)

1 个 comboBox

1 个 label

布局:

3 个 lineEdit 和 1 个 comboBox、1 个 label 程度布局

2 个 PushButton 和一个弹簧程度布局

最初整体布局即可

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

二、纯代码版

注:只能两个数独自加减乘除,不能间断运算,按‘=’从新开始两个数运算

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 

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

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

退出移动版