【QT 一 | 信号和槽】

Qt5基本模块

在这里插入图片描述

Qt Creator 中的快捷键

• 注释:ctrl + /
• 运⾏:ctrl + R
• 编译:ctrl + B
• 字体缩放:ctrl + 鼠标滑轮
• 查找:ctrl + F
• 整行移动:ctrl + shift + ⬆/⬇
• 帮助⽂档:F1
• 自动对齐:ctrl + i;
• 同名之间的 .h 和 .cpp 的切换:F4
• 生成函数声明的对应定义: alt + enter

认识对象模型(对象树)

在 Qt 中,对象树是一种非常重要的概念,用于管理和组织对象之间的关系。以下是对 Qt 对象树的详细理解介绍:

1. 对象树的基本概念

  • 定义:Qt 的对象树是一种层次化的对象管理机制,基于 QObject 类实现。每个 QObject 对象可以有一个父对象(parent),并且可以拥有多个子对象(children)。
  • 父子关系:当创建一个 QObject 对象时,可以通过构造函数指定一个父对象。如果指定了父对象,那么这个新创建的对象会自动成为父对象的子对象,并被添加到父对象的 children() 列表中。

2. 对象树的作用

  • 生命周期管理:父对象负责管理其子对象的生命周期。当父对象被销毁时,其所有子对象也会被自动销毁。这种机制避免了内存泄漏,同时也简化了对象的管理。

  • 事件传播:在 GUI 程序中,事件(如鼠标点击、键盘输入等)会从父对象向下传播到子对象。这种机制使得事件处理更加高效和灵活。

  • 组件化管理:对象树使得 GUI 组件的组织更加清晰。例如,一个窗口(QWidget)可以包含多个按钮、文本框等子组件。当窗口被销毁时,所有子组件也会被自动销毁。

3. 对象树的实现机制

  • 构造函数中的父对象参数QObject 的构造函数接受一个 QObject* 类型的参数,表示父对象。例如:
    QObject* parent = new QObject();
    QObject* child = new QObject(parent);
    
    在这个例子中,child 的父对象是 parentchild 会被自动添加到 parentchildren() 列表中。
  • children() 方法:每个 QObject 对象都有一个 children() 方法,返回一个包含所有子对象的列表。
  • 自动销毁机制:当父对象被销毁时,Qt 会自动调用子对象的析构函数,销毁所有子对象。

4. 对象树的使用场景

  • GUI 组件管理:在 Qt 的 GUI 程序中,QWidget 是所有可视组件的基类,它继承自 QObject。例如:
    QWidget* window = new QWidget();
    QPushButton* button = new QPushButton(window);
    
    在这个例子中,buttonwindow 的子组件。当 window 被销毁时,button 也会被自动销毁。
  • 资源管理:对象树机制不仅适用于 GUI 组件,还可以用于管理其他资源,如文件句柄、网络连接等。

5. 注意事项

  • 避免循环引用:在使用对象树时,要避免创建循环引用(即对象 A 是对象 B 的父对象,同时对象 B 也是对象 A 的父对象)。这会导致对象无法正确销毁,从而引发内存泄漏。
  • 手动管理子对象:虽然对象树会自动管理子对象的生命周期,但也可以手动删除子对象。例如:
    QObject* child = new QObject(parent);
    delete child;  // 手动删除子对象
    
    在这种情况下,子对象会从父对象的 children() 列表中自动移除。

Qt 的对象树是一种强大的机制,用于管理和组织对象之间的关系。它不仅简化了内存管理,还使得 GUI 组件的组织更加清晰。通过合理使用对象树,可以提高代码的可维护性和可扩展性。
在 Qt 中,尽量在构造的时候就指定parent对象,并且⼤胆在堆上创建。
在这里插入图片描述## 信号与槽
如果要使用信号与槽(signal 和 slot)的机制就必须加入Q_OBJECT宏;这个宏不仅用于支持信号与槽机制,还允许 Qt 的元对象系统(Meta-Object System)自动生成一些辅助代码。

信号的本质就是事件。

  • 如:按钮单击、双击 ,窗⼝刷新等。
  • 信号的呈现形式就是函数
  • 信号函数只需要声明,不需要定义(实现)。
  • 信号函数声明用 signals 关键字修饰

槽(Slot)就是对信号响应的函数。

  • 槽是普通的成员函数,用于处理信号。槽函数可以手动实现,也可以通过 Qt 的机制自动生成。
  • 可以定义在类的任何位置( public、protected 或 private)。
  • 可以具有任何参数,可以被重载,也可以被直接调
    用(但是不能有默认参数
  • 槽函数需要定义(实现)。
  • 槽函数可以与⼀个信号关联,当信号被发射时,关联的槽函数被自动执行。
  • 槽函数用 public slots、protected lots 或者 private slots 修饰。

signals 和 slots 是 Qt 在 C++ 的基础上扩展的关键字

connect函数

在 Qt 中,QObject 类提供了⼀个静态成员函数connect(),该函数专门来关联指定的信号函数和槽函数。
connect函数原型

connect (const QObject *sender,
const char * signal ,
const QObject * receiver ,
const char * method ,
Qt::ConnectionType type = Qt::AutoConnection )

参数说明:
• sender:信号的发送者;
• signal:发送的信号(信号函数);
• receiver:信号的接收者;
• method:接收信号的槽函数;
• type:用于指定关联方式,默认的关方式为 Qt::AutoConnection,通常不需要手动设定。

自动生成槽函数的机制

  • 步骤
    1. 在 Qt Creator 中,添加一个信号( mySignal(int value)
    2. 右键点击信号或信号声明。
    3. 选择 “转到槽”(Go to Slot)或 “转到信号”(Go to Signal)。
    4. Qt Creator 会自动生成一个槽函数的声明和定义,并将其添加到类中。

例如,对于信号 mySignal(int value),Qt Creator 会生成如下代码:

// 在头文件中自动生成槽函数声明
public slots:void on_mySignal(int value);// 在实现文件中自动生成槽函数定义
void MyObject::on_mySignal(int value)
{// 在这里实现槽函数的逻辑
}
  • 自动生成的槽函数
    • 当你在类中声明信号时,Qt 的元对象系统会自动为这些信号生成默认的槽函数。这些槽函数通常以 on_<SignalName> 的形式命名。
    • 按照这种命名风格格定义的槽函数,会被 Qt ⾃动的和对应的信号进行连接。
      日常写代码,最好还是不要依赖命名规则,而是显式
      使用 connect 更好。1. connect 可以更清晰直观的描述信号和槽的连接关系。2. 防止信号或者槽的名字拼写错误导致连接失效.
  • 使用方法
    • 在类的声明中,添加信号声明。
    • 在类的实现中,实现自动生成的槽函数。
    • 使用 QObject::connect() 将信号连接到自动生成的槽函数。
通过 Qt 的 Q_INVOKABLE

Q_INVOKABLE 宏可以将普通成员函数标记为可调用的槽函数。虽然这不是严格意义上的“自动生成”,但它允许开发者将任意函数作为槽函数使用。

  • 使用方法
    • 在类的声明中,使用 Q_INVOKABLE 宏标记成员函数。
    • 这些函数可以直接作为槽函数使用。

例如:

class MyObject : public QObject
{Q_OBJECT
public:MyObject(QObject* parent = nullptr);Q_INVOKABLE void mySlotFunction(int value);  // 使用 Q_INVOKABLE 标记signals:void mySignal(int value);
};void MyObject::mySlotFunction(int value)
{qDebug() << "Slot function called with value:" << value;
}// 连接信号和槽
connect(this, &MyObject::mySignal, this, &MyObject::mySlotFunction);

自定义信号函数和槽函数

  1. ⾃定义信号函数书写规范
    (1)⾃定义信号函数必须写到 “signals” 下;
    (2)返回值为 void,只需要声明,不需要实现;
    (3)可以有参数,也可以发生重载
  2. ⾃定义槽函数书写规范
    (1)早期的 Qt 版本要求槽函数必须写到 “public slots” 下,但是现在⾼级版本的 Qt 允许写到类的 “public” 作用域中或者全局下;
    (2)返回值为 void,需要声明,也需要实现;
    (3)可以有参数,可以发生重载;
    3、发送信号
    使用 “emit” 关键字发送信号。“emit” 是⼀个空的宏。"emit"其实是可选的,没有什么含义,只
    是为了提醒开发⼈员。

关联函数一定要在发射信号之前
原因是,⾸先关联信号和槽,⼀旦检测到信号发射之后就会立即执行关联的槽函数。反之,若先发射信号,此时还没有关联槽函数,当信号发射之后槽函数不会响应。

信号与槽的断开

在这里插入图片描述
当"connect"函数第三个参数为"this" 时,第四个参数使⽤ Lambda表达式时,可以省略掉 “this”

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

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

相关文章

集成学习方法之随机森林

随机森林是一种集成学习算法&#xff0c;它基于决策树模型&#xff0c;通过构建多个决策树并将它们的预测结果进行组合&#xff0c;以提高模型的准确性和稳定性。以下是随机森林的详细介绍&#xff1a; 原理 随机森林通过从原始训练数据中有放回地随机抽样&#xff0c;生成多…

react 中,使用antd layout布局中的sider 做sider的展开和收起功能

一 话不多说&#xff0c;先展示效果&#xff1a; 展开时&#xff1a; 收起时&#xff1a; 二、实现代码如下 react 文件 import React, {useState} from react; import {Layout} from antd; import styles from "./index.module.less"; // 这个是样式文件&#…

【Java 基础】-- Java 接口中的 @Public 和 @FunctionalInterface 注解详解

目录 Java 接口中的 Public 和 FunctionalInterface 注解详解 1. 概述 2. Public 注解的作用 3. Public 注解的使用 3.1 基本使用方式 3.2 应用于类和方法 4. FunctionalInterface 注解的作用 4.1 主要作用 4.2 FunctionalInterface 使用示例 4.3 允许默认方法 5. Pu…

go语言环境下载与配置(Windows)

下载 Go下载 - Go语言中文网 - Golang中文社区 建议在D盘中创建文件夹安装到 D 盘 &#xff0c;方便进行管理&#xff0c;然后进行傻瓜式安装。 安装 验证安装 go version 安装成功 配置环境变量 winE --> 右击此电脑 --> 选择属性 --> 高级系统设置 --> 点击…

nss刷题5(misc)

[HUBUCTF 2022 新生赛]最简单的misc 打开后是一张图片&#xff0c;没有其他东西&#xff0c;分离不出来&#xff0c;看看lsb&#xff0c;红绿蓝都是0&#xff0c;看到头是png&#xff0c;重新保存为png&#xff0c;得到一张二维码 扫码得到flag [羊城杯 2021]签到题 是个动图…

OkHttp、Retrofit、RxJava:一文讲清楚

一、okHttp的同步和异步请求 Call 是 OkHttp 的核心接口&#xff0c;代表一个已准备好执行的 HTTP 请求。它支持 同步 和 异步 两种模式&#xff1a; enqueue——>okHttp异步 OkHttpClient client new OkHttpClient();Request request new Request.Builder().url("…

Redis分布式缓存面试题

为什么使用分布式缓存&#xff1f; 1. 提升性能 降低延迟&#xff1a;将数据缓存在离应用更近的地方&#xff0c;减少数据访问时间。减轻数据库压力&#xff1a;缓存频繁访问的数据&#xff0c;减少对后端数据库的请求&#xff0c;提升系统响应速度。 2. 扩展性 水平扩展&a…

基于阿里云PAI平台快速部署DeepSeek大模型实战指南

一、DeepSeek大模型&#xff1a;企业级AI应用的新标杆 1.1 为什么选择DeepSeek&#xff1f; 近期&#xff0c;DeepSeek系列模型凭借其接近GPT-4的性能和开源策略&#xff0c;成为全球开发者关注的焦点。在多项国际评测中&#xff0c;DeepSeek-R1模型在推理能力、多语言支持和…

C++---了解STL

上节学习了模板&#xff0c;那么就得谈到C的标准模板库STL。 C98&#xff1a;以模板方式重写了C标准库&#xff0c;引入了STL(标准模板库)。 1.概念 STL(Standard template Libarary)标准模板库&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&am…

分享几款比较常用的接口测试工具

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

Qt layout

文章目录 Qt layout**关键机制****验证示例****常见误区****最佳实践****总结**关键点总结&#xff1a;示例代码说明&#xff1a;结论&#xff1a; Qt layout 在 Qt 中&#xff0c;当调用 widget->setLayout(layout) 时&#xff0c;layout 的父对象会被自动设置为该 widget…

flutter: table calendar笔记

pub dev&#xff1a;table_calendar 3.2.0 我来详细解释 TableCalendar 是如何根据不同的 CalendarFormat 来显示界面的。主要逻辑在 CalendarCore 中实现。 核心逻辑分为以下几个部分&#xff1a; 页面数量计算 - _getPageCount 方法根据不同格式计算总页数&#xff1a; in…

【C++】各个版本新的特性和改进

C 语言自从其诞生以来&#xff0c;经历了多个版本的更新&#xff0c;每个版本都引入了新的特性和改进&#xff0c;目的是提升语言的表达能力、性能、安全性以及开发效率。下面是各个主要版本&#xff08;从 C98 到 C20&#xff09;的一些关键特性。 C98 (1998年) ISO C 标准化…

C++模板与STL七日斩:从工业编程到高效数据管理(工业项目)

模板如何提升工业代码复用性 实战项目&#xff1a;创建通用【工业设备容器】模板类 类模板的定义与实例化模板参数默认值 #include <iostream> #include <string> using namespace std;template <typename T string> class IndustrialContainer { priva…

sh脚本把服务器B,服务器C目录的文件下载到服务器A目录,添加开机自启动并且一小时执行一次脚本

脚本逻辑 第一次会下载,第二次比较如果有就不下载 文件已存在&#xff1a; 如果目标目录中已经存在同名文件&#xff0c;rsync 会比较源文件和目标文件的大小和修改时间。 如果源文件和目标文件的大小和修改时间完全相同&#xff0c;rsync 会跳过该文件&#xff0c;不会重新下载…

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异&#xff0c;以下是综合多个来源的常用方法及注意事项&#xff1a; 通过ADB命令注入GPS数据&#xff08;适用于技术用户&#xff09; 1.连接云手机 使用ADB工具连接云手机服务器&#xff0c;…

透彻理解:方差、协方差、相关系数、协方差矩阵及其应用

最近看了几篇跨领域特征对齐方面的经典文献&#xff0c;学者们搞了很多花样&#xff0c;如有的提出一阶统计特征对齐&#xff0c;有的提出二阶统计特征对齐&#xff0c;有的学者提出高阶统计特征对齐。 通俗而言&#xff0c;就是在统计特征层面对跨域特征进行对齐&#xff0c;…

Unity基础学习(二)

二、Mono中的重要内容 1、延迟函数 &#xff08;1&#xff09;延迟函数定义 延迟执行的函数&#xff0c;可以设定要延迟执行的函数和具体延迟的时间 &#xff08;2&#xff09;延迟函数的使用 #region 1、延迟函数//函数&#xff1a;Invoke(函数名/字符串&#xff0c;延迟时…

20250212:ZLKMedia 推流

1:资料 快速开始 ZLMediaKit/ZLMediaKit Wiki GitHub GitHub - ZLMediaKit/ZLMediaKit: WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT server and client framework based on C++11 文档里面提供了各个系…

Holoens2开发报错记录02_通过主机获取彩色和深度数据流常见错误

01.E1696 E1696 无法打开源文件 “stdio.h” 解决方法&#xff1a; 更新一下SDK 1&#xff09;打开Visual Studio Installer&#xff0c;点击修改 2&#xff09;安装详细信息中自己系统对应的SDK&#xff0c;点击修改即可 02.WinError 10060 方法来源 解决方法&#xff1a…