QT----计算器

news2024/11/15 18:02:40

目录

  • 1 搭建标准界面
  • 2、 逻辑编写
    • 2.1 初始化

github链接:基于qt的计算器

1 搭建标准界面

按照下图搭设界面

在这里插入图片描述

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改最大的样式表

*
{
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 初始化

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

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来记录上一个按键,若是一次计算完成则清空

#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;
}


头文件

#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

成果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024会声会影 软件介绍、下载,功能介绍及问题解答

会声会影正式版是一款使用起来十分件便捷的影视后期视频编辑处理软件&#xff0c;会声会影正式版操作简单&#xff0c;还具备了独特创意、灵活有趣等特点&#xff0c;并且软件还具备了上百种滤镜和特效、调控速度、从多机新增视讯片段等等功能&#xff0c;会声会影官方版便捷好…

2024上海网络安全产业创新大会成功举办,天空卫士成为焦点

2月28日&#xff0c;由上海市经济和信息化委员会、上海市普陀区人民政府主办的2024上海网络安全产业创新大会在上海跨国采购会展中心举办。天空卫士受邀参加2023年重点行业网络安全解决方案揭榜结果发布暨合作签约仪式&#xff0c;并参加了工业互联网安全产业创新论坛和数据安全…

【Python】新手入门学习:什么是python解释器,它的作用是什么?

【Python】新手入门学习&#xff1a;什么是python解释器&#xff0c;它的作用是什么&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基…

Day37:安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类

目录 JNDI注入-RMI&LDAP服务 JNDI远程调用-JNDI-Injection JNDI远程调用-marshalsec JNDI-Injection & marshalsec 实现原理 JNDI注入-FastJson漏洞结合 JNDI注入-JDK高版本注入绕过 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文…

C语言⽂件操作

1. 为什么使⽤⽂件 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久化的保存&…

羊大师分析,羊奶养生智慧

羊大师分析&#xff0c;羊奶养生智慧 羊奶&#xff0c;这一古老而自然的饮品&#xff0c;近年来逐渐受到越来越多人的青睐。其独特的营养价值与养生功效&#xff0c;使得羊奶成为了追求健康生活的人们的理想选择。那么&#xff0c;羊奶究竟蕴藏着怎样的养生智慧呢&#xff1f;…

MQ的相关概念

微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 同步通讯 同步调用的优点&#xff1a; 时效性较强&#xff0c;可以立即得到结果 Feign调用就属于同…

计算机网络:应用层知识点汇总

文章目录 一、网络应用模型二、域名系统&#xff08;DNS&#xff09;三、文本传输协议&#xff08;FTP&#xff09;四、电子邮件五、万维网和HTTP协议 一、网络应用模型 p2p也就是对等模型 二、域名系统&#xff08;DNS&#xff09; 我们知道&#xff0c;随着人们建立一个网站…

Redis底层数据结构之String

文章目录 1. 前提回顾2. RedisObject三大数据类型简介3. SDS字符串4. SDS字符串源码分析5. 总结 1. 前提回顾 前面我们说到redis的String数据结构在底层有多种编码方式。例如我们执行下面两条语句 set k1 v1 set age 17我们查看类型&#xff0c;发现这类型都是String类型 我们…

动态规划课堂5-----子序列问题(动态规划 + 哈希表)

目录 引言&#xff1a; 例题1&#xff1a;最长递增子序列 例题2&#xff1a;最长定差子序列 例题3&#xff1a;最长的斐波那契子序列的长度 例题4&#xff1a;最长等差数列 例题5&#xff1a;等差数列划分II-子序列 结语&#xff1a; 引言&#xff1a; 要想解决子序列问…

pc端vue2项目使用uniapp组件

项目示例下载 运行实例&#xff1a; 这是我在pc端做移动端底代码时的需求&#xff0c;只能在vue2使用&#xff0c;vue3暂时不知道怎么兼容。 安装依赖包时可能会报&#xff1a;npm install Failed to set up Chromium r756035! Set “PUPPETEER_SKIP_DOWNLOAD” env variable …

伪分布式Spark集群搭建

一、软件环境 软 件 版 本 安 装 包 VMware虚拟机 16 VMware-workstation-full-16.2.2-19200509.exe SSH连接工具 FinalShell Linux OS CentOS7.5 CentOS-7.5-x86_64-DVD-1804.iso JDK 1.8 jdk-8u161-linux-x64.tar.gz Spark 3.2.1 spark-3.2.1-bin-…

JVM的整体架构

JVM的整体架构 JVM的架构模型 基本上是基于栈的指令集架构 基于栈式架构的特点 设计和实现更简单&#xff0c;适用于资源受限的系统避开了寄存器的分配难题&#xff1a;使用零地址指令方式分配指令流中的指令大部分是零地址指令&#xff0c;其执行过程依赖于操作栈。指令集更…

AI写作一键生成原创文案,效率高!

AI写作一键生成原创文案&#xff0c;效率高&#xff01;当下时代&#xff0c;文案写作对于各个企业推广产品和服务显得隔外重要。优秀的文案能够吸引用户的注意力&#xff0c;激发购买欲望&#xff0c;从而为企业带来更多的销售机会。然而&#xff0c;对于许多人来说&#xff0…

【Python】新手入门学习:什么是工作目录?

【Python】新手入门学习&#xff1a;什么是工作目录&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得…

【Python机器学习系列】自助法计算机器学习评价指标的置信区间(案例+源码)

这是我的第235篇原创文章。 一、引言 Bootstrap方法是非常有用的一种统计学上的估计方法&#xff0c;是一类非参数Monte Carlo方法&#xff0c;其实质是对观测信息进行再抽样&#xff0c;进而对总体的分布特性进行统计推断。 自助法计算分类模型的AUC、准确率、特异度和灵敏…

商业楼宇一卡通解决方案(1)

智能楼宇发展 智能楼宇也称智能建筑,又称智能大厦。智能楼宇是将建筑技术、通信技术、计算机技术和控制技术等各方面的先进科学技术相互融合、合理集成为最优化的整体,具有工程投资合理、设备高度自动化、信息管理科学、服务高效优质、使用灵活方便和环境安全舒适等特点,是…

Caffeine--实现进程缓存

本地进程缓存特点 缓存在日常开发中起着至关重要的作用, 由于存储在内存中, 数据的读取速度非常快,能大量减少对数据库的访问,减少数据库的压力. 缓存分为两类: 分布式缓存, 例如Redis: 优点: 存储容量大, 可靠性更好, 可以在集群间共享缺点: 访问缓存存在网络开销场景: 缓存数…

Python网站的搭建和html基础

1.Python网站代码及讲解 一般我们搭建小型的网站就用flask库就行了。 &#xff08;1&#xff09;安装flask库 安装完python后&#xff0c;按住windows徽标键和r,弹出“运行”&#xff0c;在里面输入cmd。 回车打开&#xff0c;输入“pip install flask”。 &#xff08;2&am…

4. C++ 类的大小

C 类的大小 ​ C类的大小&#xff0c;是一个比较经典的问题&#xff0c;学过C后&#xff0c;应该对类大小有清晰的认识&#xff0c;长话短说&#xff0c;本文精简凝练&#xff0c;我们进入正题&#xff01;&#xff01;&#xff01; 1.类的大小与什么有关系&#xff1f; 与类…