引言
最近在做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最后執行,相當於彈起操作