QT經驗(一)——按鈕長按事件分析

唯有自己強大發表於2021-08-04

引言

最近在做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的所有子類都適用

結論:

  1. pressed最先執行,相當於按下操作
  2. 按下之後,按鈕狀態發生變化,觸發toggled
  3. clicked最後執行,相當於彈起操作

 

相關文章