用Qt做出WIndow中的计算器

Qt实现计算器

一、前景介绍

目前这个计算器只实现了简单的加减乘除。
缺点:

  1. 没有实现连续加减乘除功能
  2. 结果数值较长,无法全部显示
  3. 计算完一次,需要清除一次(点击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计算器!漂亮的界面,加上好玩的逻辑,学习编程也可以非常有趣! --爱编程的可达鸭

好的,下面是一个简单的基于Qt计算器示例代码。你可以根据需要自行修改。 ```cpp #include <QtWidgets/QApplication> #include <QtWidgets/QWidget> #include <QtWidgets/QVBoxLayout> #include <QtWidgets/QGridLayout> #include <QtWidgets/QLineEdit> #include <QtWidgets/QPushButton> class Calculator : public QWidget { Q_OBJECT public: Calculator(QWidget *parent = nullptr) : QWidget(parent) { // 设置窗口标题和大小 setWindowTitle(tr("Calculator")); setFixedSize(250, 200); // 创建文本框 QLineEdit *lineEdit = new QLineEdit(this); lineEdit->setReadOnly(true); lineEdit->setAlignment(Qt::AlignRight); lineEdit->setText("0"); // 创建按钮 QPushButton *button0 = new QPushButton(tr("0"), this); QPushButton *button1 = new QPushButton(tr("1"), this); QPushButton *button2 = new QPushButton(tr("2"), this); QPushButton *button3 = new QPushButton(tr("3"), this); QPushButton *button4 = new QPushButton(tr("4"), this); QPushButton *button5 = new QPushButton(tr("5"), this); QPushButton *button6 = new QPushButton(tr("6"), this); QPushButton *button7 = new QPushButton(tr("7"), this); QPushButton *button8 = new QPushButton(tr("8"), this); QPushButton *button9 = new QPushButton(tr("9"), this); QPushButton *buttonAdd = new QPushButton(tr("+"), this); QPushButton *buttonSubtract = new QPushButton(tr("-"), this); QPushButton *buttonMultiply = new QPushButton(tr("*"), this); QPushButton *buttonDivide = new QPushButton(tr("/"), this); QPushButton *buttonClear = new QPushButton(tr("C"), this); QPushButton *buttonEqual = new QPushButton(tr("="), this); // 创建网格布局 QGridLayout *gridLayout = new QGridLayout(this); gridLayout->addWidget(lineEdit, 0, 0, 1, 4); gridLayout->addWidget(button7, 1, 0); gridLayout->addWidget(button8, 1, 1); gridLayout->addWidget(button9, 1, 2); gridLayout->addWidget(buttonAdd, 1, 3); gridLayout->addWidget(button4, 2, 0); gridLayout->addWidget(button5, 2, 1); gridLayout->addWidget(button6, 2, 2); gridLayout->addWidget(buttonSubtract, 2, 3); gridLayout->addWidget(button1, 3, 0); gridLayout->addWidget(button2, 3, 1); gridLayout->addWidget(button3, 3, 2); gridLayout->addWidget(buttonMultiply, 3, 3); gridLayout->addWidget(buttonClear, 4, 0); gridLayout->addWidget(button0, 4, 1); gridLayout->addWidget(buttonEqual, 4, 2); gridLayout->addWidget(buttonDivide, 4, 3); // 创建垂直布局 QVBoxLayout *vBoxLayout = new QVBoxLayout(this); vBoxLayout->addLayout(gridLayout); setLayout(vBoxLayout); // 信号和槽连接 connect(button0, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(button1, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(button2, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(button3, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(button4, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(button5, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(button6, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(button7, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(button8, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(button9, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(buttonAdd, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(buttonSubtract, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(buttonMultiply, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(buttonDivide, SIGNAL(clicked()), this, SLOT(buttonClicked())); connect(buttonClear, SIGNAL(clicked()), this, SLOT(clear())); connect(buttonEqual, SIGNAL(clicked()), this, SLOT(result())); } public slots: void buttonClicked() { QPushButton *button = qobject_cast<QPushButton *>(sender()); QString buttonValue = button->text(); QLineEdit *lineEdit = findChild<QLineEdit *>("lineEdit"); QString lineEditText = lineEdit->text(); if (lineEditText == "0") { lineEditText = ""; } lineEditText += buttonValue; lineEdit->setText(lineEditText); } void clear() { QLineEdit *lineEdit = findChild<QLineEdit *>("lineEdit"); lineEdit->setText("0"); } void result() { QLineEdit *lineEdit = findChild<QLineEdit *>("lineEdit"); QString expression = lineEdit->text(); double result = 0; int operatorIndex = -1; if (expression.contains("+")) { operatorIndex = expression.indexOf("+"); result = expression.left(operatorIndex).toDouble() + expression.right(expression.length() - operatorIndex - 1).toDouble(); } else if (expression.contains("-")) { operatorIndex = expression.indexOf("-"); result = expression.left(operatorIndex).toDouble() - expression.right(expression.length() - operatorIndex - 1).toDouble(); } else if (expression.contains("*")) { operatorIndex = expression.indexOf("*"); result = expression.left(operatorIndex).toDouble() * expression.right(expression.length() - operatorIndex - 1).toDouble(); } else if (expression.contains("/")) { operatorIndex = expression.indexOf("/"); result = expression.left(operatorIndex).toDouble() / expression.right(expression.length() - operatorIndex - 1).toDouble(); } lineEdit->setText(QString::number(result)); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); Calculator calculator; calculator.show(); return a.exec(); } #include "main.moc" ``` 这个计算器界面比较简单,只有一个文本框和一些按钮。你可以根据需求自己修改界面和代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值