1. 发送一次信号,调用多次槽函数问题

在同一个类中,多次链接QObject::connect(sender, SIGNAL(signalSender(QString, int)), receiver, SLOT(onSignalSender(QString, int))); 会导致发送一次信号signalSender(QString, int) 多次调用槽函数(onSignalSender(QString, int),如果链接了一次,那么,发送一次signalSender信号,就调用一次onSignalSender槽函数,如果链接了两次,那么发送一次signalSender信号,就调用两次onSignalSender槽函数,。。。以此类推。

2. 信号的直接调用问题

在Qt中,一般发送信号都是通过 emit signalSender() 方式发送的,其实也可以通过直接调用信号  signalSender()进行发送,此时,如果调用了信号signalSender,且该信号通过connect进行了链接,则会进入对用链接的槽函数中执行。 注意:在多线程中,直接调用是在调用者线程中执行,发信号是在接收者线程中执行

3.

信号是可以连接另一个信号的

例如

connect(push_button, &qpushlbutton::clicked, this, & qwidget :: buttonclicked );

Qt信号与信号连接、Qt4连接写法

1.信号与信号连接

更改代码

#include "widget.h"

#include "ui_widget.h"

#include

#include

//Teacher类

//Student类

//下课后老师会触发一个信号(饿了),学生响应信号(请客吃饭)

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

//创建一个老师的对象

this->th = new Teacher();

//创建一个学生的对象

this->stu = new Student();

//重载连接,需要用到函数指针,指向明确的函数地址

//无参函数连接,两种写法

void(Teacher::* teacherSignal0)() = &Teacher::hungry;

void(Student::* studentSlot0)(void) = &Student::treat;

connect(th,teacherSignal0,stu,studentSlot0);

//有参连接

void(Teacher::* teacherSignal)(QString) = &Teacher::hungry;

void(Student::* studentSlot)(QString) = &Student::treat;

connect(th,teacherSignal,stu,studentSlot);

//点击叮叮叮按钮,再触发下课

QPushButton* btn = new QPushButton("叮叮叮",this);

//第一种实现

//connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

//第二种实现

//信号连接信号

connect(btn,&QPushButton::clicked,th,teacherSignal0);

resize(400,400);

}

void Widget::classIsOver()

{

//下课函数,触发后发送老师饿了的信号

//emit出发信号 qt独有语法

emit th->hungry();

emit th->hungry("昏睡红茶");

qDebug() << "------------";

}

Widget::~Widget()

{

delete ui;

}

注意:信号连接时,信号与槽的参数必须一一对应。不然会报

static assertion failed: Signal and slot arguments are not compatible.

的bug。

扩展内容

一个信号可以连接多个槽函数

多个信号可以连接一个槽函数

信号和槽函数的参数必须一一对应

信号参数个数可以多余槽的参数个数,但类型要一一对应

Qt4版本以前的信号与槽的连接

连接无参

connect(th,SIGNAL(hungry()),stu,SLOT(treat()));

优点,参数直观。缺点,类型不做检测(编译不做检测,运行报错)

Qt5以上支持Qt4的写法,反之不支持。

qt, connect参数,Qt::DirectConnection,Qt::QueuedConnection

connect用于连接qt的信号和槽,在qt编程过程中不可或缺。它其实有第五个参数,只是一般使用默认值,在满足某些特殊需求的时候可能需要手动设置。

Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。

Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。

Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。

Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。

Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。

qt信号发送间隔短而槽耗时多_Qt信号槽问题汇总 - osc_9q1dp3jk的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. qt撤销与回退_Qt 的撤销回退事件 - osc_1i3ltp99的个人空间 - OSCHINA - 中文开源技术交流社区...

    Qt 的撤销回退事件 日期 作者 版本 2020年12月16日 Mister H V1.0 前言 在工作中有时候需要撤销和回退(重做)功能,而在网上的资料大多都相同且较复杂,研究了一段时间,终于看出了 ...

  2. qt调用c语言编写的dll文件,Qt之调用外部DLL - moki_oschina的个人空间 - OSCHINA - 中文开源技术交流社区...

    预备知识: 1.如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用. 2.通常Windows ...

  3. qt和python关系_Python与Qt - AlphaJay的个人空间 - OSCHINA - 中文开源技术交流社区

    入门知识- Python与Qt关系 1. Qt内建的Script支持:Qt Script for Applications (QSA),跨平台脚本工具箱,为静态的Qt/C++程序提供了一个脚本界面,可 ...

  4. 服务器图文消息发送规则,群发图文规则 - CurtainRight的个人空间 - OSCHINA - 中文开源技术交流社区...

    2.上传图文接口 内容信息对比: 注意:除了群发图文之外,其余的图文消息都是没有Content,所以都是自己写页面,然后通过URL打开新的页面,那么你的图片就不能访问微信服务器上的图片.因为现在未经授 ...

  5. php短信炸弹,php发送短信炸弹 - rookier的个人页面 - OSCHINA - 中文开源技术交流社区...

    /** *本代码仅仅适用于利用X-FORWARDED-FOR获取客户端IP的网站 *对于其他获取的无效 */ echo ' ';//自动刷新,间隔时间5秒 function curlrequest($ ...

  6. Qt信号发送过快,槽函数处理不过来解决方法

    问题: 跨线程使用信号与槽连接,信号的发送时间间隔小于槽函数处理的时间间隔,造成的问题. 子线程下的槽函数,用sleep来模拟槽函数的耗时操作: void MyThread::myTimeout() ...

  7. java短信验证码失效时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...

    Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis) 这篇文章,实现了Java发送手机短信验证码发送的间隔时间,以及手机验证码的有效时间和手机验证码格式的合法性验证,可以防 ...

  8. Java设置短信间隔时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...

    标签:url   control   operation   短信验证码   reg   cep   ppi   任务   用户 Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+R ...

  9. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

最新文章

  1. 【C++】枚举类型应用
  2. 装饰模式(Decorator Pattern)--------结构型模式
  3. subversion commit 报错A checksum mismatch occurred
  4. 【SSH三个框架】Hibernate第八部分基础:经营-many关系
  5. AngularJS 深入理解 $scope 转载▼
  6. [UE4]自动旋转组件
  7. 两条线段的夹角 cesium_《原本》命题1.10 一条线段可以被分成两条相等的线段
  8. Java03接口与内部类
  9. import torch 找不到模块_Python零基础入门:关于Python模块与包的详细解读和使用...
  10. 关于pad、智能手机功能增进的设想
  11. Win7 下安装ubuntu14.04双系统
  12. vivo S9无法激活手机了vivoS9e怎么解锁平台刷机教程屏幕锁不记得了可以用这个方法教程重装系统固件软件S9手机如果已忘记密码可以自己学习升级降级USB操作了
  13. Java语言程序设计(第3版)沈泽刚主编第6,7,8章课后习题答案
  14. android 个人标准身高计算器,Android开发:标准身高计算器应用的…
  15. Vue验证座机号的同时验证手机号
  16. 「小狼毫」-- rimeime 中州韵输入法引擎
  17. 前台离岗提示语_酒店前台温馨提示语
  18. 一个40岁程序员的经历
  19. 什么是抽象类,接口?他们的区别?(详解)
  20. 计算机科学速成课 Crash Course Computer Science 笔记(摘要形式)

热门文章

  1. 虚幻中的风格化环境制作学习教程
  2. 虚幻引擎5–环境设计学习教程
  3. LTE CRS 时频资源
  4. C++ STL: 基本六大部件概览 及 各个容器使用方式和底层实现概览
  5. QT 中使用 OpenCv 的 CascadeClassifier 报错
  6. 轻量级git服务器 Gogs git 服务器搭建
  7. 成都Uber优步司机奖励政策(1月9日)
  8. 5个常用Java代码混淆器 助你保护你的代码
  9. extjs 4 tab panel得strip在IE下右偏解决办法
  10. ItemsControl 解析