引言
最近在做qt项目,需要对button按钮添加一个长按事件(比如点击按钮,开始运动。松开按钮,运动停止)。查了些许资料,(差点误把QPushButton的press信号和长按事件混淆)在此记录一下经验。
setAutoRepeat
以前一直以为QPushButton不支持长按,才发现还有这个功能。用起来很简单:
QPushButton *pBtnSub = new QPushButton(this);
pBtnSub->setAutoRepeat(true); //启用长按
pBtnSub->setAutoRepeatDelay(400);//触发长按的时间
pBtnSub->setAutoRepeatInterval(50);//长按时click信号间隔
connect(pBtnSub,&QPushButton::clicked,[&]{
qDebug()<<"send";
其实在这之前我瞄了眼MouseEvent,它是没有repeat这个东西的,所以一个按钮被鼠标点击还能连续触发,那基本就是一个定时器做出来的。所以应该说是鼠标按下Delay时间后会启动一个多次触发的TimerEvent(定时器),由timeOut再次触发click槽。
QPushButton 点击信号分析
再来分析一下QPushButton的点击信号。QPushButton有三个很重要的信号跟点击有关:
- pressed
- clicked
- toggled
表面上看,pressed和clicked都会在点击按钮时触发,它们有什么区别呢?toggled好像有时候触发,有时候不触发,到底怎么回事呢?下面就一起聊一下这三个信号
验证过程就不放了,直接给结论吧!
首先,这三个信号都是从QAbstractButton继承来的,也就是说,下面情况对QAbstractButton的所有子类都适用
结论:
- pressed最先执行,相当于按下操作
- 按下之后,按钮状态发生变化,触发toggled
- clicked最后执行,相当于弹起操作