【QT】概述|对象树模型|两种控件模式|信号和槽|lambda
目录
什么是QT
特点
QT程序
main函数
QT按钮
纯代码模式
图形化模式
对象树模型
信号和槽
连接与断开
自动连接
断开连接
信号的发射
lambda表达式
基本语法
捕获列表
Lambda表达式用于信号与槽的连接
例如
什么是QT
Qt是一个跨平台的C++图形用户界面应用程序框架。
在QT中,一个函数对应着一个相对应的头文件,文件和函数名相同;
当然了,有的头文件也会隐式包含了其它头文件,所以有些函数不需要特意去包含相对应的头文件
特点
- 跨平台,几乎支持所有的平台
- 接口简单,容易上手,学习QT框架对学习其他框架有参考意义。
- 一定程度上简化了内存回收机制
- 开发效率高,能够快速的构建应用程序。
- 有很好的社区氛围,市场份额在缓慢上升。
- 可以进行嵌入式开发。
QT程序
main函数

QT按钮
QT控件的创建,一般有两种方式:
- 通过图形化的方式,在界面上创建出一个控件,显示设置文本。
- 通过纯代码的方式,通过编写代码,在界面上创建控件,显示设置文本。
纯代码模式
通过代码创建按钮,指定挂到对象树上,方便日后的资源释放
通过按钮对象来调用不同的方法函数来实现不同功能
如果只是创建出对象,是无法显示到窗口中的,所以我们需要依赖一个父窗口,也就是指定一个父亲。(按钮也是继承于QWidget,也属于窗口)。
图形化模式
用图形化模式创建一个按钮,只需要在ui文件内,选择需要的控件拖拽到窗口区即可。
当然,后续还可以添加qrc文件来达到更好的效果。

对象树模型
在Qt中,当一个对象被创建时,可以指定其父对象。
QObject是Qt里边绝大部分类的根类
QObject对象之间是以对象树的形式组织起来的。
- 当两个QObject(或子类)的对象建立了父子关系的时候。子对象就会加入到父对象的一个成员变量叫children(孩子)的list(列表)中。
- 当一个父对象被销毁时,它的所有子对象也会被自动销毁,从而释放它们占用的资源。
对象树确保的是先释放⼦节点的内存, 后释放⽗节点的内存. ⽽析构函数的调⽤顺序则不⼀定遵守上述要求. 因此看到⼦节点的析构执⾏顺序反⽽在⽗节点析构顺序 之后.
注: 调⽤析构函数和释放内存并⾮是同⼀件事。
信号和槽
信号和槽是实现对象间通信的一种机制;
对象在发生信号后,另一个对象可以连接信号到自己的槽函数上,响应。
信号(signals):
- 信号是Qt中的一种特殊函数,它在特定事件发生时被发射(emit)。
- 信号可以携带参数,这些参数在信号发射时传递给连接的槽函数。
槽(Slots):
- 槽是Qt中的一种特殊成员函数,可以连接到信号上。
- 槽函数可以有参数,也可以没有参数。如果有参数,这些参数必须与连接的信号的参数匹配。
连接与断开
自动连接
信号和槽是自动连接的;
两种方式连接:
- 在Qt Designer中,可以通过拖动信号到槽来自动创建连接。
- 也可以在代码中使用 QObject::connect 函数来手动创建连接。
断开连接
使用 QObject::disconnect 函数来断开信号和槽之间的连接。
断开连接可以防止槽函数在不需要的时候被调用。
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//信号源是 图形化按钮 关闭后 谁来处理 怎么处理connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handclicked);
}
//手动添加 处理图形化pushbutton1槽函数
void Widget::handclicked()
{this->setWindowTitle("标题修改成标题1");qDebug()<<"handclicked1";
}void Widget::handclicked2()
{//切换原来槽信号后,this->setWindowTitle("标题修改为2");qDebug()<<"handclicked2";
}void Widget::on_pushButton_2_clicked()
{//1.先断开pushButton原来的 信号槽//如果没有 disconnect, 就会构成 一个信号绑定了两个槽函数. 触发信号的时候, 两个槽函数都会执行.disconnect(ui->pushButton,&QPushButton::clicked,this,&Widget::handclicked);//2.重新绑定信号槽connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handclicked2);
}
信号的发射
信号的发射是通过调用 emit 关键字实现的。
// myclass.hsignals: // 信号声明部分void mySignal(int value); // 自定义信号,参数为int类型
// myclass.cpp
#include "myclass.h"void MyClass::someMethod()
{int value = 10;emit mySignal(value); // 发射信号,并传递一个int值
}
#include <QApplication>
#include "myclass.h"class Receiver : public QObject
{Q_OBJECTpublic slots:void receiveValue(int value) // 对应的槽函数{qDebug() << "Received value:" << value;}
};
lambda表达式
C++11中的Lambda表达式用于定义匿名的函数对象,以简化编程工作。
基本语法
[捕获列表](参数列表) -> 返回类型 { 函数体 }
[capture-list] (parameters) -> return-type { body; }
- capture-list(捕获列表): 定义了lambda函数体中可以访问的外部变量。可以是空的,或者使用[&]捕获所有外部变量的引用,[=]捕获所有外部变量的值,或者明确指定个别变量,如[x, &y]表示按值捕获x,按引用捕获y。
- parameters(参数列表): 类似于常规函数的参数列表,可以为空。
- -> return-type(返回类型): 可选,明确指定lambda函数的返回类型。如果不写,则编译器会根据函数体推导返回类型。
- body(函数体): 包含了lambda表达式执行的具体代码。
捕获列表
[=]:以传值方式捕获所有局部变量。
[&]:以引用方式捕获所有局部变量。
[变量]:捕获特定变量,可以使用=或&指定捕获方式。
Lambda表达式用于信号与槽的连接
QObject::connect(sender, &SenderClass::signalName, [=]() {// Lambda表达式内的代码
});
例如
#include "widget.h"
#include "ui_widget.h"#include<QPushButton>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//lanbda的使用QPushButton* button = new QPushButton(this);button->setText("按钮");button->move(200,200);//链接connect(button,&QPushButton::clicked,this,[=](){qDebug()<<"lambda被执行";this->setWindowTitle("我是窗口标题");this->move(100,100);});
}

相关文章:
【QT】概述|对象树模型|两种控件模式|信号和槽|lambda
目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…...
Java中的安全编码实践与防御技巧
Java中的安全编码实践与防御技巧 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨Java中的安全编码实践与防御技巧,这对于开发人员来说…...
linux 常用的命令、文件路径、其他工具或软件包
命令 sudo apt dist-upgrade 解决显示 暂不升级、未被升级dd if/dev/zero of./rootfs.img bs1G count6 制作一个 6G 的空白镜像。bs 是块字节数,count 是 bs 的个数。dd if./rootfs.img of/dev/sdc2 bs512 烧录 rootfs.img 镜像到 /dev/sdc2。bs 是 512 个字节&…...
00 如何根据规律在变化中求发展?
你好,我是周大壮。目前,我已在搜索推荐等算法技术领域从事研发近 10 年,做过诸多流量分发领域的算法技术工作。 如今任 58 同城的算法架构师、技术委员会人工智能分会委员、58 本地服务事业群算法策略部负责人,我主要负责 58 集团…...
UUID和自增ID做主键到底哪个好?
UUID(通用唯一识别码) 优点: 全局唯一性:由不同算法生成,确保全球范围内的唯一性,避免主键冲突。不可预测性:随机生成,难以被猜测,适合保密性应用。分布式应用࿱…...
FW SystemUI Keyguard解析(二)
文章目录 CTS之Keyguard Menu事件处理 CTS之Keyguard Menu事件处理 事件触发点: NotificationShadeWindowViewController.dispatchKeyEvent 设置setInteractionEventHandler回调之后通过NotificationShadeWindowView 触发 调用到return mService.onMenuPressed(); public cla…...
MySQL之备份与恢复(二)
备份与恢复 定义恢复需求 如果一切正常,那么永远也不需要考虑恢复。但是,一旦需要恢复,只有世界上最好的备份系统是没用的,还需要一个强大的恢复系统。 不幸的是,让备份系统平滑工作比构造良好的恢复过程和工具更容易…...
MySQL:保护数据库
保护数据库 1. 用户1.1 创建用户1.2 查看用户1.3 删除用户1.4 修改密码 2. 权限2.1 授予权限2.2 查看权限2.3 撤销权限 之前都是介绍本地数据库而你自己就是数据库的唯一用户,所以不必考虑安全问题。但实际业务中数据库大多放在服务器里,你必须妥善处理好…...
不是大厂云用不起,而是五洛云更有性价比
明月代维的一个客户的大厂云境外云服务器再有几天就到期了,续费提醒那是提前一周准时到来,但是看到客户发来的续费价格截图,我是真的没忍住。这不就是在杀熟吗?就这配置续费竟然如此昂贵?说实话这个客户的服务器代维是…...
C++初学者指南-3.自定义类型(第一部分)-异常
C初学者指南-3.自定义类型(第一部分)-异常 文章目录 C初学者指南-3.自定义类型(第一部分)-异常简介什么是异常?第一个示例用途:报告违反规则的行为异常的替代方案标准库异常处理 问题和保证资源泄露使用 RAII 避免内存泄漏!析构函数:不要让异…...
学会python——用python编写一个电子时钟(python实例十七)
目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.电子时钟程序 3.1 代码构思 3.2代码实例 3.3运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性…...
elementui中@click短时间内多次触发,@click重复点击,做不允许重复点击处理
click快速点击,发生多次触发 2.代码示例: //html<el-button :loading"submitLoading" type"primary" click"submitForm">确 定</el-button>data() {return {submitLoading:false,}}//方法/** 提交按钮 */sub…...
助力游戏实现应用内运营闭环,融云游戏社交方案升级!
通信能力在所有应用场景都是必备组件,这源于社交属性带给应用的增长神话。 在游戏场景,玩家从少数核心向大众用户泛化扩展的过程,就是游戏深度融合社交能力的过程。 从单机到联机,游戏乐趣的升级 1996 年,游戏界顶流…...
守护创新之魂:源代码防泄漏的终极策略
在信息化快速发展的今天,企业的核心机密数据,尤其是源代码,成为了企业竞争力的关键所在。然而,源代码的泄露风险也随之增加,给企业的安全和发展带来了巨大威胁。在这样的背景下,SDC沙盒作为一种创新的源代码…...
Halcon 基于分水岭的目标分割
一 分水岭 1 分水岭介绍 传统的分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是地质学上的拓扑地貌,图像中每一像素的灰度值表示该点的海拔高度,每一个局部极小值及其周边区域称为集水盆地&…...
PHP 面向对象编程(OOP)入门指南
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,通过使用对象来设计和组织代码。PHP作为一种广泛使用的服务器端脚本语言,支持面向对象编程。本文将介绍PHP面向对象编程的基本概念和用法࿰…...
Django学习第三天
python manage.py runserver 使用以上的命令启动项目 实现新建用户数据功能 views.py文件代码 from django.shortcuts import render, redirect from app01 import models# Create your views here. def depart_list(request):""" 部门列表 ""&qu…...
Vue3实现点击按钮实现文字变色
1.动态样式实现 1.1核心代码解释: class"power-station-perspective-item-text": 为这个 span 元素添加了一个 CSS 类,以便对其样式进行定义。 click"clickItem(item.id)": 这是一个 Vue 事件绑定。当用户点…...
深入理解Vue生命周期钩子函数
深入理解Vue生命周期钩子函数 Vue.js 是一款流行的前端框架,通过其强大的响应式数据绑定和组件化的开发方式,使得前端开发变得更加简单和高效。在Vue应用中,每个组件都有其生命周期,这些生命周期钩子函数允许开发者在不同阶段执行…...
Linux-gdb
目录 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 4.快速跳出函数体 5.其他 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 断点的本质是帮助我们缩小出问题的范围 比如,…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...

