当前位置: 首页 > news >正文

【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中的安全编码实践与防御技巧 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨Java中的安全编码实践与防御技巧&#xff0c;这对于开发人员来说…...

linux 常用的命令、文件路径、其他工具或软件包

命令 sudo apt dist-upgrade 解决显示 暂不升级、未被升级dd if/dev/zero of./rootfs.img bs1G count6 制作一个 6G 的空白镜像。bs 是块字节数&#xff0c;count 是 bs 的个数。dd if./rootfs.img of/dev/sdc2 bs512 烧录 rootfs.img 镜像到 /dev/sdc2。bs 是 512 个字节&…...

00 如何根据规律在变化中求发展?

你好&#xff0c;我是周大壮。目前&#xff0c;我已在搜索推荐等算法技术领域从事研发近 10 年&#xff0c;做过诸多流量分发领域的算法技术工作。 如今任 58 同城的算法架构师、技术委员会人工智能分会委员、58 本地服务事业群算法策略部负责人&#xff0c;我主要负责 58 集团…...

UUID和自增ID做主键到底哪个好?

UUID&#xff08;通用唯一识别码&#xff09; 优点&#xff1a; 全局唯一性&#xff1a;由不同算法生成&#xff0c;确保全球范围内的唯一性&#xff0c;避免主键冲突。不可预测性&#xff1a;随机生成&#xff0c;难以被猜测&#xff0c;适合保密性应用。分布式应用&#xff1…...

FW SystemUI Keyguard解析(二)

文章目录 CTS之Keyguard Menu事件处理 CTS之Keyguard Menu事件处理 事件触发点: NotificationShadeWindowViewController.dispatchKeyEvent 设置setInteractionEventHandler回调之后通过NotificationShadeWindowView 触发 调用到return mService.onMenuPressed(); public cla…...

MySQL之备份与恢复(二)

备份与恢复 定义恢复需求 如果一切正常&#xff0c;那么永远也不需要考虑恢复。但是&#xff0c;一旦需要恢复&#xff0c;只有世界上最好的备份系统是没用的&#xff0c;还需要一个强大的恢复系统。 不幸的是&#xff0c;让备份系统平滑工作比构造良好的恢复过程和工具更容易…...

MySQL:保护数据库

保护数据库 1. 用户1.1 创建用户1.2 查看用户1.3 删除用户1.4 修改密码 2. 权限2.1 授予权限2.2 查看权限2.3 撤销权限 之前都是介绍本地数据库而你自己就是数据库的唯一用户&#xff0c;所以不必考虑安全问题。但实际业务中数据库大多放在服务器里&#xff0c;你必须妥善处理好…...

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了&#xff0c;续费提醒那是提前一周准时到来&#xff0c;但是看到客户发来的续费价格截图&#xff0c;我是真的没忍住。这不就是在杀熟吗&#xff1f;就这配置续费竟然如此昂贵&#xff1f;说实话这个客户的服务器代维是…...

C++初学者指南-3.自定义类型(第一部分)-异常

C初学者指南-3.自定义类型(第一部分)-异常 文章目录 C初学者指南-3.自定义类型(第一部分)-异常简介什么是异常&#xff1f;第一个示例用途:报告违反规则的行为异常的替代方案标准库异常处理 问题和保证资源泄露使用 RAII 避免内存泄漏&#xff01;析构函数&#xff1a;不要让异…...

学会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快速点击&#xff0c;发生多次触发 2.代码示例&#xff1a; //html<el-button :loading"submitLoading" type"primary" click"submitForm">确 定</el-button>data() {return {submitLoading:false,}}//方法/** 提交按钮 */sub…...

助力游戏实现应用内运营闭环,融云游戏社交方案升级!

通信能力在所有应用场景都是必备组件&#xff0c;这源于社交属性带给应用的增长神话。 在游戏场景&#xff0c;玩家从少数核心向大众用户泛化扩展的过程&#xff0c;就是游戏深度融合社交能力的过程。 从单机到联机&#xff0c;游戏乐趣的升级 1996 年&#xff0c;游戏界顶流…...

守护创新之魂:源代码防泄漏的终极策略

在信息化快速发展的今天&#xff0c;企业的核心机密数据&#xff0c;尤其是源代码&#xff0c;成为了企业竞争力的关键所在。然而&#xff0c;源代码的泄露风险也随之增加&#xff0c;给企业的安全和发展带来了巨大威胁。在这样的背景下&#xff0c;SDC沙盒作为一种创新的源代码…...

Halcon 基于分水岭的目标分割

一 分水岭 1 分水岭介绍 传统的分水岭分割方法&#xff0c;是一种基于拓扑理论的数学形态学的分割方法&#xff0c;其基本思想是把图像看作是地质学上的拓扑地貌&#xff0c;图像中每一像素的灰度值表示该点的海拔高度&#xff0c;每一个局部极小值及其周边区域称为集水盆地&…...

PHP 面向对象编程(OOP)入门指南

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;通过使用对象来设计和组织代码。PHP作为一种广泛使用的服务器端脚本语言&#xff0c;支持面向对象编程。本文将介绍PHP面向对象编程的基本概念和用法&#xff0…...

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核心代码解释&#xff1a; class"power-station-perspective-item-text"&#xff1a; 为这个 span 元素添加了一个 CSS 类&#xff0c;以便对其样式进行定义。 click"clickItem(item.id)"&#xff1a; 这是一个 Vue 事件绑定。当用户点…...

深入理解Vue生命周期钩子函数

深入理解Vue生命周期钩子函数 Vue.js 是一款流行的前端框架&#xff0c;通过其强大的响应式数据绑定和组件化的开发方式&#xff0c;使得前端开发变得更加简单和高效。在Vue应用中&#xff0c;每个组件都有其生命周期&#xff0c;这些生命周期钩子函数允许开发者在不同阶段执行…...

Linux-gdb

目录 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 4.快速跳出函数体 5.其他 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 断点的本质是帮助我们缩小出问题的范围 比如&#xff0c;…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...