QT----计算器

目录

  • [1 搭建标准界面](#1 搭建标准界面)
  • [2、 逻辑编写](#2、 逻辑编写)
    • [2.1 初始化](#2.1 初始化)

github链接:基于qt的计算器

1 搭建标准界面

按照下图搭设界面

修改样式让这计算器看起来更像一点,同时对按钮分组进行样式编辑,添加字符串name,为number,其他按键为other。之前的文章里出现过好几次不在赘述

修改最大的样式表

cpp 复制代码
*
{
border:none;
background-color: rgb(243, 243, 243);
}
/* */
QPushButton
{
font: bold 12pt '微软雅黑';
}
QPushButton[name = "number"]
{
border-radius:4px;
background-color: rgb(252, 252, 252); 
}
QPushButton[name = "other"]
{
border-radius:4px;
background-color: rgb(246, 246, 246);
}
/*增加鼠标悬浮背景色 */
QPushButton[name = "number"]:hover
{
border:1px solid rgb(193,193,193);
background-color: rgb(221, 223, 221);
}
QPushButton[name = "other"]:hover
{
border:1px solid rgb(193,193,193);
background-color: rgb(221, 223, 221);
}

接着修改文字输入部分,让他们文字全部右对齐,打开readonly,光标就不会闪烁

2、 逻辑编写

2.1 初始化

首先初始化获得所有的按钮,放入组,方便后续操作,在自己写个槽函数用于处理点击的流程

cpp 复制代码
void cell_Standui::initUI()
{
    //1、把所有的按钮放到一个按钮组里边
    QButtonGroup * buttonGroup = new QButtonGroup(this);
    auto btnList = findChildren<QPushButton*>();
    for(auto btn : btnList)
    {
        buttonGroup->addButton(btn);
    }

    //2、关联按钮组的点击信号
    connect(buttonGroup,&QButtonGroup::buttonClicked,this,&cell_Standui::onButtonGroupClicked);
  vec.resize(5);


}

显示数字,记录比较简单,难点在于各种符号的切换,以及过程和最终结果的显示,在一开始输入时需要清除0,按完=号后,在次输入要清空记录;使用容器记录存着的数和操作过程;根号和平方等只有一个运算数,单独写;使用一个prebtn来记录上一个按键,若是一次计算完成则清空

cpp 复制代码
#include "cell_standui.h"
#include "ui_cell_standui.h"

cell_Standui::cell_Standui(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::cell_Standui)
{
    ui->setupUi(this);
    initUI();
}

cell_Standui::~cell_Standui()
{
    delete ui;
}

void cell_Standui::initUI()
{
    //1、把所有的按钮放到一个按钮组里边
    QButtonGroup * buttonGroup = new QButtonGroup(this);
    auto btnList = findChildren<QPushButton*>();
    for(auto btn : btnList)
    {
        buttonGroup->addButton(btn);
    }

    //2、关联按钮组的点击信号
    connect(buttonGroup,&QButtonGroup::buttonClicked,this,&cell_Standui::onButtonGroupClicked);
    vec.resize(5);
}

void cell_Standui::onButtonGroupClicked(QAbstractButton *btn)
{
    //获取按钮的名称
    // qDebug()<<btn->objectName();

    //首先把框里的数赋值
    auto val1 = ui->le_result->text().toFloat();
    QStringList nameList = btn->objectName().split('_');
    QString name = nameList[1];


    if(name >="0" && name <= "9" || name == "point" )
    {
        //把一开始的0清除
        if(name != "point" && ui->le_result->text() == "0")
        {
            ui->le_result->clear();
        }
        //如果点击数字键的时候输入框有数据,而且表达式框只有两个数据,则重置为刚刚输入的
        if(preBtn == "add" || preBtn == "multiplication" ||preBtn == "subtraction" || preBtn == "divide")
        {
            ui->le_result->clear();
        }
        else if(preBtn == "result" || preBtn == "squareroot" || preBtn == "square" || preBtn == "quarter")
        {
            //判断上次的按钮是不是=,如果是那么一次计算就算完成了,清空所有内容
            ui->le_result->clear();
            ui->le_history->clear();
            vec.clear();
            vec.resize(5);
        }
        //输入数字
        ui->le_result->insert(btn->text());
    }
    else if(name == "ce")
    {
        //清空
        ui->le_result->clear();
    }
    else if(name == "c")
    {
        //清空
        ui->le_result->clear();
        ui->le_history->clear();
        vec.clear();
        vec.resize(5);
    }
    else if(name == "del")
    {
        //删除
        //先让光标的位置移动到前一位
        ui->le_result->setCursorPosition(ui->le_result->cursorPosition()-1);
        ui->le_result->del();
    }
    //输入符号
    else if(name == "add")
    {
        if(vec.size() != 2)
        {
            //把左操作数和运算符保存起来
            vec[0] = val1;
            vec[1] = "+";
        }
    }
    else if(name == "subtraction")
    {
        if(vec.size() != 2)
        {
            //把左操作数和运算符保存起来
            vec[0] = val1;
            vec[1] = "-";
        }
    }
    else if(name == "multiplication")
    {
        if(vec.size() != 2)
        {
            //把左操作数和运算符保存起来
            vec[0] = val1;
            vec[1] = "×";
        }
    }
    else if(name == "divide")
    {
        if(vec.size() != 2)
        {
            //把左操作数和运算符保存起来
            vec[0] = val1;
            vec[1] = "÷";
        }
    }
    else if(name == "result")
    {
        vec[2] = val1;
        vec[3] = "=";
        if(vec[1] == "+")
        {
            vec[4] = vec[0].toFloat()+vec[2].toFloat();
        }
        else if(vec[1] == "-")
        {
            vec[4] = vec[0].toFloat()-vec[2].toFloat();
        }
        else if(vec[1] == "×")
        {
            vec[4] = vec[0].toFloat()*vec[2].toFloat();
        }
        else if(vec[1] == "÷")
        {
            vec[4] = vec[0].toFloat()/vec[2].toFloat();
        }
        ui->le_result->clear();
        ui->le_result->setText(vec[4].toString());
    }
    else if(name == "squareroot")
    {

        //把左操作数和运算符保存起来
        vec[0] = "√ ";
        vec[1] = val1;
        vec[2] = "=" ;
        vec[3] = sqrt(val1);
        ui->le_result->clear();
        ui->le_result->setText(vec[3].toString());
    }
    else if(name == "square")
    {

        //把左操作数和运算符保存起来
        vec[0] = val1;
        vec[1] = "²";
        vec[2] = "=" ;
        vec[3] = val1*val1;
        ui->le_result->clear();
        ui->le_result->setText(vec[3].toString());
    }
    else if(name == "quarter")
    {

        //把左操作数和运算符保存起来
        vec[0] = "1/";
        vec[1] = val1;
        vec[2] = "=" ;
        vec[3] = 1/val1;
        ui->le_result->clear();
        ui->le_result->setText(vec[3].toString());
    }
    else if(name == "mod")
    {

        //把左操作数和运算符保存起来
        vec[0] = val1;
        vec[1] = "%";
        vec[2] = "=" ;
        vec[3] = val1/100;
        ui->le_result->clear();
        ui->le_result->setText(vec[3].toString());
    }

    //显示表达式,每次都清空重新显示
    ui->le_history->clear();
    for(auto var : vec)
    {
        ui->le_history->insert(var.toString());
    }

    preBtn = name;
}

头文件

cpp 复制代码
#ifndef CELL_STANDUI_H
#define CELL_STANDUI_H

#include <QMainWindow>
#include <QButtonGroup>>
#include <QDebug>
#include <QVector>
#include <QVariant>

namespace Ui {
class cell_Standui;
}

class cell_Standui : public QMainWindow
{
    Q_OBJECT

public:
    explicit cell_Standui(QWidget *parent = nullptr);
    ~cell_Standui();
    void initUI();

public slots:
    void onButtonGroupClicked(QAbstractButton* btn);

private:
    Ui::cell_Standui *ui;

    QVector<QVariant> vec;

    //记录上一个按钮的名字
    QString preBtn;
};

#endif // CELL_STANDUI_H

成果图


相关推荐
夜晚回家16 分钟前
Python 零基础入门 | 输入的数字为什么不能直接算
开发语言·python
时间的拾荒人17 分钟前
Qt 事件机制全解析:从事件处理到事件过滤器
开发语言·qt·面试
于指尖飞舞20 分钟前
java面试题总结
java·开发语言
zhangzeyuaaa2 小时前
深入理解 Ruby 运算符:本质、分类、坑点与重载实战
开发语言·前端·ruby
一木 之林2 小时前
DeepSeek Agent 开发(一)
开发语言·前端·javascript
朔北之忘 Clancy2 小时前
青少年软编等考七级题解目录
开发语言·c++·青少年编程·gesp·csp·信奥赛·noi
ss2732 小时前
AI全栈实战 | 3.2-01 Python 基础:四大数据容器怎么选,推导式为什么是 Pythonic 的灵魂
开发语言·人工智能·python
Mr_Macallon2 小时前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
未来之窗软件服务2 小时前
Go 利器 GoReSym:剥离符号恢复 Go 二进制元数据—东方仙盟
开发语言·golang·仙盟创梦ide·东方仙盟
朝朝辞暮i3 小时前
C++ 第 32 课:main()、rclcpp::init()、spin()、shutdown()
开发语言·c++·算法