qt connect重复 槽函数会重复触发

现象

ClassA::ClassA(QWidget* pParent)
	:QWidget(pParent)
{
	connect(m_ui.btnNext, SIGNAL(clicked()), this, SLOT(Slot_next_clicked()));
	```
	connect(m_ui.btnNext, SIGNAL(clicked()), this, SLOT(Slot_next_clicked()));
}

说明:
m_ui.btnNext是一个button,不小心把连接btnNext的connect写了两遍
导致,点击一次btnNext就触发两次Slot_next_clicked()

避坑

disconnect

每次槽函数使用完后,调用disconnect将信号与槽的绑定解除
另外一个坑
使用 QProcess m_Process 开启一个进程时,也需要disconnect。
场景:点击一个button,m_Process开启一个新的进程,界面和进程交互通信。待进程结束,可以再次点击按钮开启新的进程
如果只在类的构造函数中写

		connect(&m_Process, SIGNAL(readyRead()), this, SLOT(Slot_readData()));//读就绪

那么Slot_readData()只有第一次会被触发,再次点击按钮槽函数不生效
因为这是新的进程
所以每次点击按钮之后都需要

		disconnect(&m_Process, SIGNAL(readyRead()), this, SLOT(Slot_readData()));//读就绪
		connect(&m_Process, SIGNAL(readyRead()), this, SLOT(Slot_readData()));//读就绪

connect连接方式选择

connect的第五个参数选择Qt::UniqueConnection , 防止重复连接, 如果当前信号和槽已经连接过了,就不再连接了

connect(m_ui.btnNext, SIGNAL(clicked()), this, SLOT(Slot_next_clicked()), Qt::UniqueConnection);

作者:诸葛不亮
链接:https://www.zhihu.com/question/316419740/answer/631686787
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1、智能指针如何实现被调用函数在对方线程执行?
2、当有几十个类协作,跨越十多个模块,它们的调用关系交织成图状,请问如何用unique_ptr shared_ptr weak_ptr正确描述这个调用关系并管理好生命周期和所有权?如果程序运行到一半,用户改了下配置,这张图的结构刷新了呢?智能指针加同步调用这种面向过程的风格,怕是连一开始的流程图都画不出来吧?
3、智能指针如何能够做到割裂依赖,降低耦合?如何做到“我不需要知道对方是谁,我只需要知道我发出这个信号,就会有某个人响应我”?
4、智能指针如何做到运行时的动态反射?配置文件里用字符串写道,abc对象的def(g,h,i)信号要连接至jkl对象的mno(p,q,w)函数,请用智能指针在运行时把它翻译成代码。再深入一步,如果这两个类,我连它们的头文件(包括虚基类)都看不到呢?

信号槽并不过时。现在大量新兴语言都还在用事件循环/消息队列+回调的方式实现异步和解耦,这只是信号槽最原始的低配版本,在Qt中只是作为内部基础件存在的event机制,信号槽是它们更高级的应用。至于智能指针和同步调用的方式,如果把异步机制形容为发动机的话,消息队列是它的气缸,而智能指针只是它铭牌上的螺丝钉,掉了都没事——汽缸驱动发动机运转,铭牌标识所有权。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值