你的浏览器不支持canvas

Qt槽函数的重入问题

Date: Author: zhangn

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自zhangn的云笔记

在Qt的信号槽机制中,如果一个槽函数的执行时间很长,在槽函数还没有执行结束的时候,有新的信号产生,默认情况下,该次信号不会被丢弃,而是会等槽函数执行结束后再次调用槽函数

但是在某些情况下,如果想将槽函数执行过程中所产生的新信号丢弃掉,有以下两种方法:blockSignals和disconnect
假设有如下信号槽

connect(m_play, &QShortcut::activated, this, &Editor::play);

具体方法如下

blockSignals

void Editor::play()
{
	m_play->blockSignals(true); // 屏蔽信号
	// 槽函数实现
	m_play->blockSignals(false); // 启用信号
}

优点:轻量级实现,占用资源少
缺点:会屏蔽掉对象的所有信号,无法对单一信号进行控制

disconnect

void Editor::play()
{
	disconnect(m_play, &QShortcut::activated, this, &Editor::play);
	// 槽函数实现
	connect(m_play, &QShortcut::activated, this, &Editor::play);
}

优点:可以对单一信号进行控制
缺点:每次都要对信号进行重连,执行效率相对较低


对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。