QT-面试问题信号与槽

1 信号与槽使用方式

信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

connect() 是 QObject 类的一个静态函数,而 QObject 是所有 Qt 类的基类,在实际调用时可以忽略前面的限定符,所以可以直接写为:

connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

关于信号与槽的使用,有以下一些规则需要注意:

  • 一个信号可以连接多个槽,例如:

connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(addFun(int));
connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(updateStatus(int));

这是当一个对象 spinNum 的数值发生变化时,所在窗体有两个槽进行响应,一个 addFun()用于计算,一个 updateStatus() 用于更新状态。

当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行。

  • 当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型,但可以不写参数名称。

  • 多个信号可以连接同一个槽,例如在 samp2_2(前面章节中的项目)中,让三个选择颜色的 RadioButton的clicked() 信号关联到相同的一个自定义槽函数 setTextFontColor()。

connect(ui->rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(ui->rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(ui->rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));

这样,当任何一个 RadioButton 被单击时,都会执行 setTextFontColor() 函数。

  • 一个信号可以连接另外一个信号,例如:

connect(spinNum, SIGNAL(valueChanged(int)), this, SIGNAL (refreshInfo(int));

这样,当一个信号发射时,也会发射另外一个信号,实现某些特殊的功能。

  • 严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。

  • 在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT。

  • 当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

信号与槽机制是 Qt GUI 编程的基础,使用信号与槽机制可以比较容易地将信号与响应代码关联起来

2 connect()第五个参数的作用,指定连接方式:默认,队列,直接

多线程时才有意义

默认的时候

如果是多线程,默认使用队列

如果是单线程, 默认使用直接方式

队列: 槽函数所在的线程和接收者一样

直接:槽函数所在线程和发送者一样

3 信号与槽链接成功条件:

1. 信号的参数个数与类型与对应的槽函数参数的个数与类型一致

2. 信号的参数个数多于对应的槽函数的参数个数,即对应的槽函数的参数个

数可以比信号函数少,但槽函数的所有参数类型必须与信号的参数类型保持一致

3. 槽函数与信号函数有默认参数的情况时,遵循以上的第二种规律。

综上,信号与槽想要链接成功,则槽函数有的参数个数和类型,在对应的信号函数

中必须一一对应,但信号函数的参数个数一定多于或等于槽函数的参数个数

4 一张图说明信号与槽

该图片引用自:https://blog.csdn.net/qq_37266079/article/details/102532640

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟嘻哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值