目录
一、问题描述
在使用Qt的QScrollBar组件过程中,我重写了它的valueChanged()信号相对应的槽函数,而在另一组件的回调函数中又有用到QScrollBar的setValue()方法,调试发现,当我调用它的setValue()方法时,程序会自动执行valueChanged()信号的槽函数,如何屏蔽掉这一事件呢?
其实这个问题不仅限于QScrollBar,QSpinBox等组件也存在同样的问题,可以说是Qt的一个官方bug了。
二、解决方案
解决方案有多种,比如blockSignals、QTimer::singleshot、开线程对slider进行setValue,其中最简单的方式是直接调用QScrollBar的blockSignals屏蔽掉组件信号之后再设值,设置完成之后再打开信号触发的入口。
三、代码示例
// 屏蔽信号触发
ui->verticalScrollBar->blockSignals(true);
// 设值
ui->verticalScrollBar->setValue(value);
// 恢复信号触发
ui->verticalScrollBar->blockSignals(false);