7.对象模型
对象模型
信号和槽
信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知,槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击],它会发出一个信号[clicked()],然后与该对象连接的槽函数将被自动调用。
若某个信号与多个槽关联,信号发射时,槽的执行顺序为关联顺序
新建Widget项目mysignalslot,
添加Qt设计师界面类,模板Dialog without Buttons,类名MyDialog
//mydialog.h中signals:void dlgReturn(int); // 自定义的信号
使用signals关键字
信号只需声明,不用也不能定义,只能是void
类的继承关系:QObject->QWidget->QDialog->MyDialog
运行结果:

connect()函数
函数原型
connect()函数的原型:
QMetaObject::Connection QObject::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。
MyDialog *dlg = new MyDialog(this);connect(dlg, SIGNAL(dlgReturn(int)), this, SLOT(showValue(int)));dlg->show();
基于函数指针的重载形式
Qt5加入的基于函数指针的重载形式
QMetaObject::Connection QObject::connect
(const QObject *sender, PointerToMemberFunction signal,
const QObject *receiver, PointerToMemberFunction slot,
Qt::ConnectionType type = Qt::AutoConnection);
connect(dlg, &MyDialog::dlgReturn, this, &Widget::showValue);
断开关联的disconnect()函数也有这两个形式,参数相同,缺省参数可用0占位
关联类型(第5个参数)
展开介绍connect()函数的关联类型(第5个参数)
假设有一个QPushButton对象button和一个MyClass对象myObj,
其中MyClass定义了一个槽函数mySlot()。
connect(&button, &QPushButton::clicked, &myObj, &MyClass::mySlot, Qt::AutoConnection);
- Qt::AutoConnection:自动连接
这是connect()函数的默认关联类型。当信号和槽函数运行在同一线程时,使用直接连接方式,否则使用队列连接方式。这种连接方式通常是最合适的。 - Qt::DirectConnection:直接连接
当信号clicked()被触发时,mySlot()将立即被调用,无论是哪个线程发射该信号。如果是在非GUI线程中发射信号,则槽函数也会在该线程中运行。如果是在GUI线程中发射信号,则槽函数也会在GUI线程中运行。 - Qt::QueuedConnection:队列连接
当信号clicked()被触发时,mySlot()将被放入接收对象的事件队列中,并在稍后的某个时刻被执行。这种连接方式保证了槽函数的执行发生在接收对象的线程中,并且不会阻塞发送者。 - Qt::BlockingQueuedConnection:阻塞队列连接
当信号clicked()被触发时,mySlot()将被放入接收对象的事件队列中,并阻塞发送者,直到槽函数执行完毕。这种连接方式保证了槽函数的执行发生在接收对象的线程中,但会阻塞发送者。 - Qt::UniqueConnection:唯一连接
当信号clicked()被触发时,如果已经有一个与该信号和槽函数匹配的连接存在,则不会创建新的连接。如果没有,则创建一个新的连接。这种连接方式保证了同一个信号和槽函数不会被重复连接,避免了槽函数多次执行的问题。
自动关联
打开项目mysignalslot2
//widget.cpp的构造函数QPushButton *button = new QPushButton(this); // 创建按钮button->setObjectName("myButton"); // 指定按钮的对象名ui->setupUi(this); // 要在定义了部件以后再调用这个函数
setupUi()函数使用了connectSlotsByName()函数,而且需要指定对象名,因此顺序如上面代码所示
运行结果:点击按钮,关闭窗口
属性系统
打开项目myproperty
Q_PROPERTY宏
class ClassName : public QObject
{Q_OBJECTQ_PROPERTY(type name READ name [WRITE name] [RESET name] [NOTIFY name] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool] [CONSTANT] [FINAL])...
}
本项目中的使用
Q_PROPERTY(QString userName READ getUserName WRITE setUserNameNOTIFY userNameChanged) // 注册属性userName
运行结果:

对象树与拥有权
打开项目myownership
对象树:当父对象被销毁时,它的子对象也会自动被销毁,无需手动管理。
对析构函数添加qDebug
运行结果:关闭窗口,qDebug显示如下

重定义父部件
MyButton *button2 = new MyButton;MyButton *button3 = new MyButton;QHBoxLayout *layout = new QHBoxLayout;layout->addWidget(button2);layout->addWidget(button3);//到此,三个部件都还不确定ownershipsetLayout(layout); // 在该窗口中使用布局管理器,则重定义父部件为Widget窗口
运行结果: Debug显示如下

元对象系统
moc 是 Meta-Object Compiler(元对象编译器)的缩写,是 Qt 的一个工具,用于处理带有 Qt 扩展的 C++ 代码,特别是处理信号和槽。moc 读取特殊的头文件,如 QObject、Q_OBJECT、Q_PROPERTY 等,生成相应的 C++ 代码,包括元对象代码、信号和槽的实现代码等。
若一个或多个类的声明中包含Q_OBJECT宏,则另外创建一个C++源文件
比如在刚刚的myownership项目生成的debug文件中,可以找到moc开头的C++源文件

相关文章:
7.对象模型
对象模型 信号和槽 信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知,槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击],它会发出一个信号[clicked()],然后与该对象连接的槽函数将被自动调用。 若某个信号与多…...
机器学习——基本概念
如何选择合适的模型评估指标?AUC、精准度、召回率、F1值都是什么?如何计算?有什么优缺点? 选择合适的模型评估指标需要结合具体的问题场景,根据不同的需求来选择不同的指标。以下是几个常用的评估指标: AUC…...
Qt---感觉挺重要的部分
目录 一、讲述Qt信号槽机制与优势与不足 二、Qt信号和槽的本质是什么 三、描述QT中的文件流(QTextStream)和数据流(QDataStream)的区别 四、描述QT的TCP通讯流程 服务端:(QTcpServer) 客户端:(QTcpSocket…...
springboot+vue家乡特色推荐系统(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的家乡特色推荐系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…...
在Shell脚本中通过ssh从脚本运行函数
文章目录 在Shell脚本中通过ssh从脚本运行函数declare -f 和typset -f,这两个命令有什么区别declare -f 和typset -f,这两个命令可以通过ssh运行脚本中的函数吗如果我有main.sh和util.sh,并且在main.sh中引用了util.sh,该怎么办&a…...
简单学习一下 MyBatis 动态SQL使用及原理
MyBatis 是一个优秀的持久层框架,它提供了丰富的 SQL 映射功能,可以让我们通过 XML 或注解方式来定义 SQL 语句。它很大程度上简化了数据库操作,提高了开发效率。动态 SQL 是其中一个非常重要的功能,可以让我们根据不同的条件动态…...
WhatsApp如何让客户参与变得更简单?
WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要,你可能已经把它们纳入你的社交媒体战略。 是的,WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天,它也适用于商业。 在发展WhatsApp业务时,小企业主得到了最优…...
记一次 MySQL 主从同步异常的排查记录,百转千回
本文主要内容如下: 一、现象 最近项目的测试环境遇到一个主备同步的问题: 备库的同步线程停止了,无法同步主库的数据更改。 备库报错如下: 完整的错误信息: Relay log read failure: Could not parse relay log even…...
Cpython的多线程技术之痛
历史原因 在Python官网下载的默认解释器是采用C语言编写的Cpython解释器。在Python语言开发之初,计算机都是单核CPU,每个单核CPU同一时刻只能运行一个线程。为了模拟多线程工作,这里采用了模拟机制,让不同线程根据时间片段&#…...
NDK OpenGL离屏渲染与工程代码整合
NDK系列之OpenGL离屏渲染与工程代码整合,本节主要是对上一节OpenGL渲染画面效果代码进行封装设计,将各种特效代码进行分离解耦,便于后期增加其他特效。 实现效果: 实现逻辑: 1.封装BaseFilter过滤器基类,…...
Python基础入门编程代码练习(二)
一、求1~100之间不能被3整除的数之和 循环条件:i<100循环操作 实现代码如下: def sums():sum 0for num in range(1, 101):if num % 3 ! 0:sum numprint("1~100之间不能被3整除的数之和为:%s" % (sum))sums() print("1~…...
C# | 对象池
对象池 文章目录 对象池前言什么是对象池对象池的优点对象池的缺点 实现思路示例代码 结束语 前言 当我们开发一个系统或者应用程序时,我们通常需要创建很多的对象,这些对象可能是线程、内存、数据库连接、文件句柄等等。在某些情况下,我们需…...
CSS小技巧之圆形虚线边框
虚线相信大家日常都用的比较多,常见的用法就是使用 border-style 控制不同的样式,比如设置如下边框代码: border-style: dotted dashed solid double;这将设置顶部的边框样式为点状,右边的边框样式为虚线,底部的边框样…...
QString与QByteArray互相转换的方法
QString与QByteArray互相转换的方法 [1] QString与QByteArray互相转换的方法QString转QByteArray方法QByteArray转QString方法QByteArray类同样不以’\0’为结尾QByteArray转QString,主要用buf.toHex()即可 [2] Qt开发串口通讯软件中的数据转换问题1.读取串口命令-Q…...
Springboot +Flowable,设置流程变量的方式(一)
一.简介 为什么需要流程变量。 举个例子,假设有如下一个流程,截图如下: 这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递…...
机器学习13(正则化)
文章目录 简介正则化经验风险和结构风险过拟合正则化建模策略 逻辑回归逻辑回归评估器 练习评估器训练与过拟合实验评估器的手动调参 简介 这一节详细探讨关于正则化的相关内容,并就 sklearn 中逻辑回归(评估器)的参数进行详细解释由于 skle…...
并发编程学习(十一):原子数组、
1、数组类型的原子类 原子数组类型,这个其实和AtomicInteger等类似,只不过在修改时需要指明数组下标。 CAS是按照来根据地址进行比较。数组比较地址,肯定是不行的,只能比较下标元素。而比较下标元素,就和元素的…...
递归到动态规划:省去枚举行为
如果在动态规划的过程中没有枚举行为,那严格位置依赖和傻缓存的方式并没有太大区别,但是当有枚举行为的时候(一个位置依赖于多个位置),那严格位置依赖是有优化空间的,枚举行为也许可以省去,题目…...
服务(第二十一篇)mysql高级查询语句(二)
①视图表: 视图表是虚拟表,用来存储SQL语句的定义 如果视图表和原表的字段相同,是可以进行数据修改的; 如果两者的字段不通,不可以修改数据。 语法: 创建:create view 试图表名 as ... 查…...
MYSQL高可用配置(MHA)
1、什么是MHA MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
