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