基于Qt5的计算器设计

Qt5的信号与槽


描述:信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式(发布-订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。


信号的本质:信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时候Qt对应的窗口类会发出某个信号,以此对用户的挑选做出反应。

槽的本质:在Qt中槽函数是一类特殊的功能的函数,在编码过程中也可以作为类的普通成员函数来使用。之所以称之为槽函数是因为它们还有一个职责就是对Qt框架中产生的信号进行处理。就是对信号作出的响应,对于打篮球的人来说,信号就是别人在起步投篮,你看到的这个动作就是信号,然后你会条件反射的想对其进行封盖,然后起跳,这个动作就是对应的槽
二者如何关联:使用connect函数关联。


函数原型:
QMetaObject::Connection QObject::connect(
const QObject *sender, PointerToMemberFunction signal,
const QObject *receiver, PointerToMemberFunction method,
Qt::ConnectionType type = Qt::AutoConnection);
参数:

  • sender: 发出信号的对象,也可以传入对象的指针
  • signal: 属于sender对象, 信号是一个函数, 这个参数的类型是函数
    指针, 信号函数地址
  • receiver: 信号接收者,也可以是对象指针
  • method: 属于receiver对象, 当检测到sender发出了signal信号,
    receiver对象调用method方法,信号发出之后的处理动作

// 参数 signal 和 method 都是函数地址, 因此简化之后的 connect() 如下:
connect(const QObject *sender, &QObject::signal,
const QObject *receiver, &QObject::method);

你实际使用过程中,可以直接使用对象,也可以使用对象指针。


计算器程序中的信号与槽

✨我们需要设计数字按键,加减乘除的按键,还有括号,小数点,等于号等等。

在这里插入图片描述

说明:del是删除一个位函数,delall是删除全部位函数,就是计算器的全部清除功能。is是等于号的按键槽函数

✨按钮的槽函数

void MainWindow::pushButton0()
{if(strin=="#")ui->textEdit1->clear();strin+="0";ui->textEdit1->textCursor().insertText("0");//textCursor()获取文本光标插入点的位置,后接入函数表示向光标后位置插入0
}

✨其他的数字一样。

✨括号函数的编写

//括号函数的编写void MainWindow::pushButtonzuo()
{if(strin=="#")ui->textEdit1->clear();char* s=strin.toLocal8Bit().data();if (isdigit(s[strlen(s)-1]))//左括号前面为数字的话,则表示输入错误,前面只能是QMessageBox::about(this,"输入错误","左括号前面不是直接是数字");else{ strin+="(";bracket=1;//表示前面有左括号ui->textEdit1->textCursor().insertText("(");}}

其他括号一样。

✨加减乘除的编写

void MainWindow::pushButton_add(){strin+="+";ui->textEdit1->textCursor().insertText("+");operror();}

其他运算符一样

✨删除一位按钮的函数

//删除按钮
void MainWindow::pushButton_del()
{strin.chop(1);ui->textEdit1->textCursor().deletePreviousChar();if(strin=="#")ui->textEdit1->setText("0");elseui->textEdit1->setText(strin.mid(1));
}

✨删除全部位按钮的函数

void MainWindow::pushButton_delall()
{strin="#";if(strin=="#")ui->textEdit1->setText("0");
}

✨运算符检测函数

void MainWindow::operror(int num){char*s=strin.toLocal8Bit().data();if(!isdigit(s[strlen(s)-2])&&s[strlen(s)-2]!=')'){QMessageBox::about(this,"输入有误","您输入的双目运算符无左值");strin.chop(1);for(int i=1;i<=num;i++)ui->textEdit1->textCursor().deletePreviousChar();}}

✨计算函数

double MainWindow:: cal(const QString& expression)
{QStack<double> values;//数值栈QStack<char> operatorstack;//操作符栈for(int i=0;i<expression.length();i++){if(expression.at(i)=='(')operatorstack.push(expression.at(i).toLatin1());//遇到左括号的话就入栈else if(expression.at(i) == ')')//如果遇到右括号的话,弹出操作符和操作数,直到遇到左括号。{values.push(temp.toDouble());//压入temp="";//复原while(!operatorstack.isEmpty() && operatorstack.top() != '(')//只要不为空,直到左括号{char op = operatorstack.pop();//记录顶部的操作符double num1=values.pop();//记录取出的第一个数double num2=values.pop();//记录取出的第2个数switch(op)//对不同的操作符做不同的处理{case '+': values.push( num1+num2);break;case '-': values.push(num2-num1);break;case '*': values.push(num1*num2) ;break;case '/': if (num1==0)  QMessageBox::about(this,"除数非法","除数不能为0"); else values.push(num2/num1);break;default: throw std::invalid_argument("无效的操作符");break;}}operatorstack.pop();//结束之后把左括号弹出}else if(expression.at(i) == '+'||expression.at(i) =='-')//按照优先级进行运算{values.push(temp.toDouble());//压入temp="";//复原if(!operatorstack.empty() && operatorstack.top() != '(' &&(operatorstack.top() == '*' || operatorstack.top() == '/')) //如果现在的表达式比之前的低就要出栈{char op = operatorstack.top();//记录操作符operatorstack.pop();//弹出操作符double operand1 = values.pop();double operand2 = values.pop();switch(op)//对不同的操作符做不同的处理{case '+': values.push(operand1+operand2);break;case '-': values.push (operand2-operand1);break;case '*': values.push(operand1*operand2) ;break;case '/': if (operand1==0)  QMessageBox::about(this,"除数非法","除数不能为0"); else values.push(operand2/operand1);break;default: throw std::invalid_argument("无效的操作符");break;}}operatorstack.push(expression.at(i).toLatin1());//作为运算之后就把这个运算符进行压入}else if(expression.at(i) =="*"||expression.at(i) =="/")//一律压入栈{operatorstack.push(expression.at(i).toLatin1());values.push(temp.toDouble());//压入temp="";//复原}else if(expression.at(i).isDigit() || expression.at(i)=='.')//如果是数字或者是小数点{temp=temp.append(expression.at(i));}else{qWarning() << "无法识别的字符:" << expression.at(i);return 0.0;}}if (!temp.isEmpty()){values.push(temp.toDouble());temp = "";}// 执行剩余的操作while (!operatorstack.isEmpty()){char op = operatorstack.top();operatorstack.pop();if (values.size() < 2){   qDebug()<<"value的大小为="<<values.size();qWarning() << "表达式格式不正确";return 0.0;}double operand11 = values.pop();double operand22 = values.pop();switch(op)//对不同的操作符做不同的处理{case '+': values.push(operand11+operand22);break;case '-': values.push (operand22-operand11);break;case '*': values.push(operand11*operand22) ;break;case '/': if (operand11==0)  QMessageBox::about(this,"除数非法","除数不能为0"); else values.push(operand22/operand11);break;default:throw std::invalid_argument("无效的操作符");break;}}// 最终栈中应该只有一个值,即表达式的结果if (values.size() == 1 && operatorstack.isEmpty()){double a=values.top();strin="#"+strin.setNum(a);return values.top();}else{   qDebug()<<"value的大小为="<<values.size();while (!values.isEmpty()) {qDebug()<<"数值栈的值为="<<values.pop();}qWarning() << "表达式格式不正确";return 0.0; // 处理格式不正确的情况,返回默认值或者适当的错误处理}}

结果展示:

在这里插入图片描述
初始化的启动界面

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

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

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

相关文章

TSUMU58CDT9-1显示器芯片方案

TSUMU58CDT9-1是用于LCD显示器的整体解决方案图形处理IC&#xff0c;面板分辨率高达WUXGA。它配置了高速集成三adc /PLL、集成DVI/HDMI接收器、高质量显示处理引擎、集成微控制器和支持LVDS面板接口格式的输出显示接口。TSUMU58CDT9-1支持一个灵活的可配置数字输入接口&#xf…

【MySQL系列】MySQL数据库索引详解

目录 一、为什么要用索引&#xff1f; 二、什么是索引&#xff1f; 三、MySQL索引使用场景 四、索引的原理 五、MySQL的存储引擎 六、索引的数据结构 七、索引如何使用 八、实际使用示例 九、优缺点、使用建议和注意事项 十、为什么Mysql不选择Hash索引&#xff1f; …

电脑死机的时候,CPU到底在做什么?

电脑死机&#xff0c;应该每个接触计算机的小伙伴都经历过吧。 尤其是早些年&#xff0c;电脑配置还没现在这么高的时候&#xff0c;多开几个重量级应用程序&#xff0c;死机就能如约而至&#xff0c;就算你把键盘上的CTRLALTDELETE按烂了&#xff0c;任务管理器也出不来&…

Linux基础入门

一、操作系统安装方法 1、使用u盘安装 工具&#xff08;前提条件&#xff09;&#xff1a; <1>u盘 <2>镜像文件iso/msdn.itellyou.cn <3>把u盘做成PE&#xff1a;大白菜/老毛桃/winPE/软碟通/ultralSO 设置BIOS&#xff1a;通过u盘启动 安装系统&…

什么是云存储,从对象存储说起?

在《存储系统形态之争,从块存储到统一存储》一文中我们提到了对象存储的概念,知道目前很多企业级存储都是支持对象存储的,比如EMC、NetApp和华为等。以EMC的对象存储为例,其最早在1998年就已经具备成熟的产品了,到目前已经有二十多年的历史了。如图是关于对象存储主要产品…

《银河麒麟高级服务器操作系统V10》使用

一言而论&#xff1a;讲了麒麟服务器V10的基本使用&#xff0c;包括终端、VNC 文章目录 前言基本架构环境硬件环境软件环境 麒麟安装步骤1.在宿主机上安装好VM&#xff0c;并且激活2.使用VM创建虚拟机3.启动虚拟机 终端常用点VNC的使用麒麟上安装VNC服务器Windows上安装VNC客户…

【deepspeed】【训练】【交互】【wandb】训练过程中的wandb交互如何去除

问题&#xff1a;gpt模型训练时&#xff0c;中间有询问输入账户&#xff0c;交互式的询问影响自动执行脚本&#xff0c;询问是这样的&#xff1a; 解决办法&#xff1a; 在脚本中设置环境变量&#xff0c;关闭wandb&#xff0c;如下图&#xff1a; 其他&#xff1a; log中没有…

Mysql InnoDB引擎 的hash索引

Mysql InnoDB引擎不支持hash索引&#xff0c;但是在内存结构中有一个自适应hash索引&#xff0c;来提高查询性能 当设置hash索引时会自动转换成btree索引 查一下mysql官方文档&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/create-index.html innodb_adaptive_hash_i…

第13篇:ESP32 idf wifi联网使用SNTP同步网络时间LCD ST7920液晶屏显示

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

实时云渲染应用之虚拟仿真项目的四大优势

虚拟仿真在教育领域的应用越来越广&#xff0c;尤其在科研和实验教学领域&#xff0c;这主要是因为虚拟仿真具有操作简单、场景逼真、更安全、易维护的优势。比如在实验教学过程中&#xff0c;一些实验对象相对于学生来说过于宏观或微观&#xff0c;学生不易理解&#xff0c;而…

机器学习——贝叶斯(三种分布)/鸢尾花分类分界图/文本分类应用

0、前言&#xff1a; 机器学习中的贝叶斯的理论基础是数学当中的贝叶斯公式。这篇博客强调使用方法&#xff0c;至于理论未作深究。机器学习中三种类型的贝叶斯公式&#xff1a;高斯分布&#xff08;多分类&#xff09;、多项式分布&#xff08;文本分类&#xff09;、伯努利分…

【PyTorch 08】如果要手动安装对应的包

例如有时候我们要下载 PyG &#xff0c;但是需要手动下载&#xff0c;需要进行以下步骤&#xff1a; 网站链接&#xff1a;https://data.pyg.org/whl/ 首先查看当前安装好的Pytorch版本和对应的cuda版本 1. pip list&#xff1a;查看torch版本 2. torch.version.cuda&#xf…

性能测试 —— 吞吐量和并发量的关系? 有什么区别?

吞吐量&#xff08;Throughput&#xff09;和并发量&#xff08;Concurrency&#xff09;是性能测试中常用的两个指标&#xff0c;它们描述了系统处理能力的不同方面。 吞吐量&#xff08;Throughput&#xff09; 是指系统在单位时间内能够处理的请求数量或事务数量。它常用于…

【深度学习 AIGC】stablediffusion-infinity 在无界限画布中输出绘画 Outpainting

代码&#xff1a;https://github.com/lkwq007/stablediffusion-infinity/tree/master 启动环境&#xff1a; git clone --recurse-submodules https://github.com/lkwq007/stablediffusion-infinity cd stablediffusion-infinity conda env create -f environment.yml conda …

ChatGPT 网站合集/NovelAI tag生成器/Novel资源大全

ChatGPT 网站合集 https://github.com/xx025/carrot NovelAI tag生成器 https://wolfchen.top/tag/ Novel资源大全 https://wolfchen.top/tag/doc.html 简单地说&#xff0c;Stable Diffusion被修改后做出了NovelAI&#xff0c;NovelAI离家出走便有了Naifu Naifu简单好上手&am…

Solidity 小白教程:15. 异常

Solidity 小白教程&#xff1a;15. 异常 这一讲&#xff0c;我们介绍solidity三种抛出异常的方法&#xff1a;error&#xff0c;require和assert&#xff0c;并比较三种方法的gas消耗。 异常 写智能合约经常会出bug&#xff0c;solidity中的异常命令帮助我们debug。 Error …

QT实战之翻金币游戏【详细过程及介绍】

目录 前言 一、游戏整体分析 二、创建项目 三、添加资源 四、主界面实现 1、设置游戏主场景基本配置 2、设置背景图片 3、创建开始按钮并设置动画 4、创建关卡选择界面并实现主界面与其的切换 五、关卡选择界面实现 1、设置关卡选择场景基本配置 2、设置关卡选择场…

c++day7---9.14

思维导图&#xff1a; #include <iostream> using namespace std;template<typename T> class myVector { private:T* arr;size_t size; //元素数量size_t max_size; //数组容量 public://构造函数myVector() :arr(nullptr), size(0), max_size(0) {}myVector(i…

JenniAI:基于AI的文章生成器写作助手

【产品介绍】 • 名称 JenniAI • 成立/上线时间 2022年 • 具体描述 Jenni AI是一个基于AI的文章写作助手&#xff0c;通过使用先进的人工智能技术帮助用户更快、更好、更有创意地写作。无论用户需要写一篇论文、一篇博客、一封邮件、…

virtualbox虚拟机中安装FreeDOS系统和DJGPP编译环境

一、安装FreeDOS系统 1、从官网下载FreeDOS系统镜像&#xff0c;下载的压缩包中包含两个文件&#xff1a;后缀为.iso和.img的镜像 ​​​下载页面 http://www.freedos.org/download/ 直接下载链接 https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.…