QT----计算器
目录
- 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_OBJECTpublic: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
成果图
相关文章:

QT----计算器
目录 1 搭建标准界面2、 逻辑编写2.1 初始化 github链接:基于qt的计算器 更多内容可以点击这里查看个人博客:个人博客 1 搭建标准界面 按照下图搭设界面 修改样式让这计算器看起来更像一点,同时对按钮分组进行样式编辑,添加字符…...

Linux:kubernetes(k8s)Deployment的操作(13)
创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…...

20240619-James-快速鸟瞰并发编程, 呕心沥血整理的架构技术(第3篇)
接着第1, 2篇后,我们继续来跟进一下并发编程的其它内容,如下: 第9节 java.util.concurrent包 线程池 线程池的核心接口是ExecutorService。java.util.concurrent还提供了一个静态工厂类Executors,其中包含用于创建配置线程池的…...

C语言——详解字符函数和字符串函数(一)
Hi,铁子们好呀!今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下: 文章目录 🎆1.字符分类函数💯💯⏩1.1 什么是字符分类函数的?💯💯⏩1.2 字符函数的类型有哪…...

三款内衣洗衣机的顶级较量:希亦、小吉、由利,谁才是性价比之王?
洗衣机在我们的生活中可谓是非常常见的了,几乎每家每户都具备着一台。即便是有洗衣机,也有不少人不会将自己我贴身衣物直接扔在洗衣机里清洗,而是会自己手工手洗。这跟我们传统上的观念有很大的关系,认为把内衣、内裤等贴身衣物放…...

Java枚举多值映射应用
在日常系统交互中,经常遇到两个系统间定义的枚举不一致,在接口调用时需要转换,记录实现,方便备查。 场景 双方的支付方式定义不同,一侧为数字,一侧为英文,若使用 if 判断,则显得繁琐…...

css--浮动
一. 浮动的简介 在最初,浮动是用来实现文字环绕图片效果的,现在浮动是主流的页面布局方式之一。 二. 元素浮动后的特点 🤢脱离文档流。😊不管浮动前是什么元素,浮动后:默认宽与高都是被内容撑开࿰…...

基于有限状态机开发健壮的Nodejs/TCP客户端
有限状态机是一种数学计算模型,它描述了在任何给定时间只能处于一种状态的系统的行为。形式上,有限状态机有五个部分: 初始状态值 (initial state)有限的一组状态 (states)有限的一组事件 (events)由事件驱动的一组状态转移关系 (transition…...

javaEE13(网站第8章两个课后题)
1、对“jspservletjavabean实现分页查询”功能做如下补充: (1)记录批量删除:每个记录前添加复选框,点击批量删除,删除选中记录。 增加跳转到任意页功能。用户可改变每页记录条数。 页面&am…...

【Leetcode每日一题】 递归 - 反转链表(难度⭐)(35)
1. 题目解析 题目链接:206. 反转链表 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 一、递归函数的核心任务 递归函数的主要职责是接受一个链表的头指针,并返回该链表逆序后的新头结点。递归…...

Unity基础学习
目录 基础知识点3D数学——基础Mathf三角函数坐标系 3D数学——向量向量模长和单位向量向量的加减乘除向量点乘向量叉乘向量插值运算 3D数学——四元数为何使用四元数四元数是什么四元数常用方法四元数计算 MonoBehavior中的重要内容延迟函数协同程序协同程序原理 Resources资源…...
Java并发编程学习笔记:AQS
Java并发编程学习笔记:AQS 一、底层原理核心功能同步状态管理CLH 队列和线程调度机制独占模式与共享模式模板方法设计模式自旋、阻塞与超时机制 运行流程 二、锁的公平性公平锁非公平锁 三、容器实现 JUC中的AQS(AbstractQueuedSynchronizer)…...

Github上哪些好用的工具
专注于web漏洞挖掘、内网渗透、免杀和代码审计,感谢各位师傅的关注!网安之路漫长,与君共勉! Qexo-爱写博客的师傅强烈推荐 漂亮的 Hexo 静态博客编辑器。该项目是基于 Django 的 Hexo 静态博客管理后台,支持文章管理、…...
如何确保面试流程标准化操作,避免人为因素影响**
一、背景 在招聘过程中,面试作为关键环节,其标准化操作至关重要。标准化不仅有助于提高面试效率和质量,还能减少人为因素的影响,确保公平、公正和客观。本文将从以下八个方面探讨如何确保面试流程的标准化操作。 二、明确面试标准 制定明确的面试标准和要求,确保所有面试…...

YOLOv7改进 | 更换主干网络之PP-LCNet
前言:Hello大家好,我是小哥谈。PP-LCNet是一个由百度团队针对Intel-CPU端加速而设计的轻量高性能网络。它是一种基于MKLDNN加速策略的轻量级卷积神经网络,适用于多任务,并具有提高模型准确率的方法。与之前预测速度相近的模型相比,PP-LCNet具有更高的准确性。此外,对于计…...

MySQL基础-----多表查询之子查询
目录 前言 子查询概述 1.概念 2.分类 一、标量子查询 二、列子查询 三、行子查询 四、表子查询 前言 上一期我们讲了内外连接查询以及自连接查询,那么本期我们就学习多表查询的子查询。本期会详细讲解什么是子查询,以及子查询的相关功能…...
nginx应用场景(附配置)
场景1:web服务器 server {listen 80;server_name example.com; # 替换为您的域名location / {root /data/wwwroot;index index.html index.htm;} }server {listen 443 ssl;server_name example.com; # 替换为您的域名ssl_certificate /path/to/certificate.crt;ssl…...
tvm android_rpc_test.py执行报错解决
执行 python3 tests/android_rpc_test.py 报错: Run CPU test ... Traceback (most recent call last): File "tests/android_rpc_test.py", line 129, in <module> test_rpc_module() File "tests/android_rpc_test.py", line …...

十、项目沟通管理
十、项目沟通管理 从马斯洛需求的各个层级上,都需要沟通的介入。如果缺乏沟通,甚至可能严重损伤身心健康。 沟通渠道 1、 规划沟通管理 规划沟通管理是基于每个相关方或相关方群体的信息需求、可用的组织资产,以及具体项目的需求&#x…...

SQL设计时增加说明列
后关闭sql Studio,然后打开注册表,注册表地址: 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\SQL Server Management Studio\18.0_IsoShell\DataProject 如有版本不同,红色内容有所变化,修改内容如下: SSVPropViewColumnsSQL70,SSVPropViewColumnsSQL80 全修改为 1,2,6,7…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...