Qt经典面试之理论总结(自己整理总结)

本文详细介绍了QT信号和槽的工作原理,包括信号和槽的定义、Q_OBJECT宏的作用,以及connect函数的用法,重点讲解了connect函数的第五个参数——连接类型。
摘要由CSDN通过智能技术生成

目录

1、QT信号和槽的原理和理解

2、connect函数的参数,第五个参数是什么


1、QT信号和槽的原理和理解

信号和槽机制底层是通过函数间的相互调用实现的。
信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别之处在于:
信号函数用  signals 关键字修饰,槽函数用 public slots、protected slots 或者 private slots 修饰。signals 和 slots 是 Qt 在 C++ 的基础上扩展的关键字,专门用来指明信号函数和槽函数;
说是关键字,其实不准确,实际是宏。
# define QT_ANNOTATE_ACCESS_SPECIFIER(x)
# define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
# define signals Q_SIGNALS

信号与槽的实际流程通过以上的代码和一顿操作,我们来总结一下信号与槽的具体流程。moc编译器(Qt提供)查找头文件中的signals,slots,标记出信号和槽。将信号槽信息存储到类静态变量staticMetaObject中,并且按声明顺序进行存放,建立索引。当发现有connect连接时,将信号槽的索引信息放到一个map中,彼此配对。当调用emit时,调用信号函数,并且传递发送信号的对象指针,元对象指针,信号索引,参数列表到active函数通过active函数找到在map中找到所有与信号对应的槽索引根据槽索引找到槽函数,执行槽函数。以上,便是信号槽的整个流程,总的来说就是一个“注册-索引”机制,并不存在发送系统信号之类的事情。

信号函数只需要声明,不需要定义(实现),而槽函数需要定义(实现)。
注意,并非所有的控件之间都能通过信号和槽关联起来,信号和槽机制只适用于满足以下条件的控件:
发送者和接收者都需要继承自QObject或其子类;
必须在类声明的最开始添加Q_OBJECT宏;
槽中的参数类型要和信号的参数的类型相对应,且不能比信号的参数多;
使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码;
connect()函数的返回值为bool类型,当关联成功时返回true。
而Qt5中connect()函数新加入的一种重载形式,与Qt4最大的不同就是,指定信号和槽两个参数时可以不用再使用SIGNAL()和SLOT()宏,并且槽函数不再必须是使用slots关键字声明的函数,而可以是任意能和信号关联的成员函数。


将某个信号函数和某个槽函数关联起来,需要借助 QObject 类提供的 connect() 函数。
connect() 是 QObject 类中的一个静态成员函数,专门用来关联指定的信号函数和槽函数。

一个 connect() 函数只能关联一个信号函数和一个槽函数,程序中可以包含多个 connect() 函数,能实现以下几种效果:
关联多个信号函数和多个槽函数;
一个信号函数可以关联多个槽函数,当信号发出时,与之关联的槽函数会一个接一个地执行,将按声明联系时的顺序依次调用槽。
多个信号函数可以关联同一个槽函数,无论哪个信号发出,槽函数都会执行。

2、connect函数的参数,第五个参数是什么

连接类型
1、直接连接Qt::DirectConnection,emit发射信号后立马执行槽函数,没有任何等待
2、队列连接Qt::QueuedConnection,先执行完for循环,当空闲后再执行槽函数。
3、阻塞队列连接:Qt::BlockingQueuedConnection,

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值