QT的学习(一)

前言:距离上一次摸QT已经快10年了,时光匆匆,现在已经到6.9版本了

一、安装QT

1.1、下载链接

https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/
这是国内镜像,比官网快很多了,官网那个可以用龟速来形如。

目前已采用在线下载方式,类似visual studio 2022,依稀记得,最开始接触时,需要下载源代码,然后自己适配,编译。

二、计算器

先写个计算器先熟悉下

  • 功能包含:四则运算,含小数点,可进行浮点数计算,包含括号

  • 界面设计:使用QT的UI工具进行布局
    在这里插入图片描述

大致如图所示,由于控件较多,也比较密集,所以采用网格布局(grid layout),然后为每个控件设置信号与对应的槽<=============>Windows下的win32或者MFC的事件与相关回调函数

当然除了在ui界面一个一个设置相关的槽,还可以直接通过代码来进行设置

//连接信号与槽,对C按钮使用
connect(ui->clear_Button, &QPushButton::clicked, this, [this](){express.clear();ui->display_LineEdit->setText(express);
});//连接信号与槽,对Del按钮使用
connect(ui->del_Button, &QPushButton::clicked, this, [this](){if(!express.isEmpty()){express.chop(1);ui->display_LineEdit->setText(express);}
});
  • 核心功能:实现计算器,采用逆波兰式
      1. 先了解中缀表达式:形如A+B运算符在两个操作数中间,所以就是中缀表达式,日常生活中使用的就是这种
      1. 后缀表达式:运算符在操作数后面就是,如A B +
      1. 逆波兰式的核心:就是将中缀表达式转变为后缀表达式,然后对后缀表达式进行计算
      1. 一般要使用两个栈,一个栈存放操作数,另外一个栈存放运算符。
      1. 计算终止条件,运算符栈为空,就弹出操作数栈的栈顶元素
        在这里插入图片描述
//核心代码如下
// 等号的槽函数
void Widget::on_equval_Button_clicked()
{if(express.isEmpty()){express += '0';ui->display_LineEdit->setText(express);return;}//逆波兰式进行计算try{//替换掉表达式中的XQString str = express;str.replace('X', '*');//先将中缀表达式转为后缀表达式QString post_str = infixToPostFix(str);//计算后缀表达式的值double result = calPostFix(post_str);QString temp = QString::number(result, 'g', 10);            //将其转为10位有效数字ui->display_LineEdit->setText(temp);}catch(...){express = "Error";ui->display_LineEdit->setText(express);}express.clear();
}
// 中缀转后缀
QString Widget::infixToPostFix(const QString &str)
{QStack<QChar> ops;QString ans = "";auto priority = [](const QChar c)->int{         //需要进行比较运算符的优先级,优先计算优先级高的if(c == '+' || c== '-') return 1;if(c == '*' || c== '/') return 2;return 0;};int len = str.length();for(int i = 0; i < len; ++i){QChar c= str[i];//处理数字和小数点if(c == '.' || c.isDigit()){while(i < len && (str[i] == '.' || str[i].isDigit())){ans += str[i];++i;}i--;        //再回退一格ans += ' ';     //用空格分隔数字}else if(c == '('){ops.push(c);}else if(c == ')'){while(!ops.isEmpty() && ops.top() != '('){ans += ops.top();ops.pop();ans += ' ';}if(!ops.isEmpty() && ops.top() == '('){ops.pop();}}else{          //处理四则运算符while(!ops.isEmpty() && (priority(ops.top()) > priority(c))){ans += ops.top();ops.pop();ans += ' ';}ops.push(c);}}//将剩下的运算符全部弹出while(!ops.isEmpty()){ans += ops.top();ops.pop();ans += ' ';}return ans.trimmed();
}
// 计算后缀表达式的值
double Widget::calPostFix(const QString &str)
{QStack<double> nums;QString num_str;int len = str.length();auto isOperator = [](const QChar& c)->bool{                             if(c == '+' || c == '-' || c == '*' || c == '/')    return true;return false;};for(int i = 0; i < len; ++i){QChar c = str[i];//先处理数字和小数点if(c == '.' || c.isDigit()){num_str.clear();while(i < len && (str[i].isDigit() || str[i] == '.')){num_str += str[i];++i;}i--;bool flag = false;double num = num_str.toDouble(&flag);if(flag){nums.push(num);}}else if(isOperator(c)){//操作如果<2不允许计算if(nums.size() < 2){return 0;}double num_B = nums.top();nums.pop();double num_A = nums.top();nums.pop();double result = 0.0f;switch(c.unicode()){case '+': result = num_A + num_B; break;case '-': result = num_A - num_B; break;case '*': result = num_A * num_B; break;case '/': {if(num_B == 0){return 0;}result = num_A / num_B;}break;}nums.push(result);}}if(nums.isEmpty()){return 0;}return nums.top();
}

之前逆波兰式说是两个栈,但这边优化了下,在中缀转后缀以及计算后缀时,都分别只使用了一个栈和一个字符串,用字符串模拟栈操作,减少点代码

三、小结:

3.1. 从代码中可以看到,对于堆上申请的内存,比如ui,我没有进行手动释放内存,难道不怕造成内存泄漏吗?

    QT拥有自动删除机制:- 当QT父对象被删除时,它会自动删除所有子对象- 只有当对象没有父对象时,才需要手动delete, 不过大部分对象都会被QT接管,所以不必过分关注,使用`QObject::deleteLater`来进行手动删除<br>

3.2. 没使用C++原生的STL容器,string, stack,就连基础类型char都没使用,使用的是QT这边二次封装的QString,QStack,QChar,这对于不经常写QT的人来说,确实一下子有点懵,常用的STL算法在QT这边要变形,比如原生的判断字符是否是数字,isdigit(c),在QT这边没有,而是c.isdigit(), switch表达式不能直接使用QChar,要这样使用switch(c.unicode())

Code

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

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

相关文章

亚洲数字能源独角兽的 “安全密码”:Parasoft为星星充电筑牢软件防线

当你在充电桩前等待爱车满电时&#xff0c;是否想过&#xff1a;这看似简单的充电过程&#xff0c;背后藏着多少软件代码的精密协作&#xff1f;作为亚洲数字能源领域的头部企业&#xff0c;星星充电用 “移动能源网” 连接着千万用户与新能源世界&#xff0c;而支撑这一切的&a…

安装Codex(需要用npm)

查看已经安装的包 npm list -g --depth0 npm uninstall -g anthropic-ai/claude-code 如果要卸载什么东西 安装Codex &#xff1a;npm i -g openai/codex https://openai.com/zh-Hant/codex/ 之后登录gpt账号&#xff0c;完成后就是下面的样子

HarmonyOS 开发学习分享:从入门到认证的完整路径

HarmonyOS 开发学习分享&#xff1a;从入门到认证的完整路径 大家好&#xff01;我是赵老师&#xff0c;一个深耕鸿蒙生态的开发者。最近刚通过鸿蒙生态赋能资源丰富度建设活动的讲师认证&#xff0c;想和大家分享一下 HarmonyOS 开发的学习心得和认证经验。 我的鸿蒙开发经历作…

使用Spring Boot DevTools快速重启功能

背景 在Spring Boot项目中&#xff0c;修改一些简单的代码后&#xff0c;每次手动终止并启动整个项目比较繁琐且消耗时间。Spring Boot DevTools 提供了开发时的热重启功能&#xff0c;使得在开发过程中修改代码后可以快速生效&#xff0c;而无需手动重启整个应用&#xff0c;可…

7.4Element Plus 分页与表格组件

el-pagination el-table 这两个组件是后台管理系统中最常用的数据展示与交互组合&#xff0c;通常配合使用实现 分页加载、排序、筛选、操作 等功能。一、分页组件 el-pagination用于控制大量数据的分页展示。✅ 基本结构<el-paginationv-model:current-page"currentPa…

搭建机器学习模型的数据管道架构方案

本篇文章Designing Data Pipeline Architectures for Machine Learning Models适合对数据管道架构感兴趣的读者&#xff0c;亮点在于详细解析了传统数据仓库、云原生数据湖和现代湖仓这三种架构&#xff0c;帮助理解如何将原始数据转化为可操作的预测。文中还强调了不同架构的优…

GitHub 热榜项目 - 日榜(2025-09-06)

GitHub 热榜项目 - 日榜(2025-09-06) 生成于&#xff1a;2025-09-06 统计摘要 共发现热门项目&#xff1a;15 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜显示AI自动化与安全运维为核心趋势。Bytebot、EvolutionAPI等AI代理项目凸显自然语言交互和容器化…

Homebrew执行brew install出现错误(homebrew-bottles)

问题描述 在使用homebrew安装软件时&#xff0c;出现如下报错&#xff1a; Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/bottles-portable-ruby/portable ruby-3.4.5.arm64_big_sur.bottle.tar.gz curl: (22) The requested URL returned error: 404 …

23种设计模式——工厂方法模式(Factory Method Pattern)详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;设计模式 ✨特色专栏&#xff1a;知识分享 &#x…

NPU边缘推理识物系统

目录 NPU边缘推理识物系统 一、项目简介 二、硬件介绍 三、软件设计 1、底层NPU推理代码 2、应用层QT显示代码 四、项目成果展示 NPU边缘推理识物系统 一、项目简介 物品分类是计算机视觉的重要技术&#xff0c;本项目的核心是&#xff1a;使用NPU&#xff08;神经网络…

C# WinForm分页控件实现与使用详解

C# WinForm分页控件实现与使用详解概述在WinForms应用程序开发中&#xff0c;数据分页是常见的需求。本文将介绍如何实现一个功能完整的分页控件&#xff0c;并在窗体中如何使用该控件进行数据分页展示。分页控件实现核心属性与字段public partial class PageControl : UserCon…

高级 ACL 有多强?一个规则搞定 “IP + 端口 + 协议” 三重过滤

一、实验拓扑及描述 二、实验需求 1、完成拓扑中各设备的基础配置&#xff0c;使得全网互通&#xff1b; 2、在上一个需求的基础上&#xff0c;在路由器上部署高级ACL&#xff0c;使得Client1无法访问Server的HTTP服务&#xff0c;但是PC1依然能够访问服务器及其他节点&#xf…

支持多材质密度设置的金属重量计算使用指南

传统手工计算各种型材&#xff08;如钢管、角钢、钢板等&#xff09;的重量繁琐且容易出错。 它的体积小巧&#xff0c;不足100KB&#xff0c;运行不占内存&#xff0c;绿色免安装&#xff0c;双击即开&#xff0c;使用便捷。 可计算钢管、钢板、型钢、角钢等常见型材的重量&a…

在Spring Boot中使用H2数据库

好处 程序启动时自动创建数据库数据表。 使用步骤 引入依赖&#xff1a; <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId&…

Day21_【机器学习—决策树(2)—ID3树 、C4.5树、CART树】

一、ID3 决策树1. 核心思想使用信息增益&#xff08;Information Gain&#xff09;作为特征选择的标准&#xff0c;递归地构建决策树。2. 特征选择标准信息增益&#xff08;IG&#xff09;&#xff1a;选择使信息增益最大的特征进行划分。3. 优点算法简单&#xff0c;易于理解。…

2025计算机视觉新技术

CLIP / BLIP-3 类「视觉-语言大模型」 • 是什么&#xff1a;让网络自己学会“看图说话”&#xff0c;zero-shot 就能分类、检测、检索。 • 能干什么&#xff1a;不写训练代码&#xff0c;直接一句中文 prompt 就把商品图分成 500 类。 • 落地难度&#xff1a;★☆☆&#xf…

[光学原理与应用-431]:非线性光学 - 能生成或改变激光波长的物质或元件有哪些?

要生成或改变激光波长&#xff0c;可依赖增益介质、非线性光学元件、调谐元件及特殊激光器设计&#xff0c;以下是一些关键物质和元件及其作用机制&#xff1a;一、增益介质&#xff1a;波长的“决定者”增益介质是激光器的核心&#xff0c;其原子或分子的能级结构直接决定输出…

接口权限验证有哪些方式

接口权限验证是保障 API 安全的核心机制&#xff0c;常见的方式有以下几类&#xff0c;适用于不同场景和安全需求&#xff1a; 1. 基于令牌&#xff08;token&#xff09;的验证 &#xff08;1&#xff09;JWT&#xff08;JSON Web Token&#xff09; 原理&#xff1a; 服务器验…

Go开发的自行托管代理加速服务:支持Docker与GitHub加速

HubProxy&#xff1a;一站式解决Docker与GitHub访问难题的轻量级代理服务作为开发者&#xff0c;我们经常遇到这些问题&#xff1a;Docker镜像拉取速度慢得让人抓狂&#xff0c;GitHub Release文件下载到一半断开&#xff0c;或者某些境外容器仓库完全无法访问。最近发现的hubp…

用Python打造逼真的照片桌面:从拖拽到交互的完整实现

在这个数字化时代&#xff0c;我们经常需要处理大量的照片和图片文件。今天我将带你一步步实现一个功能丰富的照片桌面程序&#xff0c;让你可以像在真实桌面上摆放照片一样操作数字图片。这个程序使用wxPython构建&#xff0c;支持拖拽、调整大小、删除等交互功能。C:\pythonc…