QPushButton點擊信號分析

QPushButton 點擊信號分析

QPushButton有三個很重要的信號跟點擊有關

  • pressed
  • clicked
  • toggled

表面上看,pressed和clicked都會在點擊按鈕時觸發,它們有什麼區別呢?toggled好像有時候觸發,有時候不觸發,到底怎麼回事呢?下面就一起聊一下這三個信號

首先,這三個信號都是從QAbstractButton繼承來的,也就是說,下面情況對QAbstractButton的所有子類都適用,

  1. 先來看第一個問題
    pressed和clicked,可以編寫一段代碼來測試一下

    QObject::connect( ui->pushButton,&QToolButton::clicked,[]{
        qDebug()<<"clicked";
    });
    QObject::connect( ui->pushButton,&QToolButton::pressed,[]{
        qDebug()<<"pressed";
    });
    

    運行後點擊按鈕,結果爲

    Debugging starts
    pressed
    clicked
    pressed
    clicked
    pressed
    clicked
    

    也就是說pressed先觸發(按下),clicked後觸發(彈起),而且如果將鼠標按壓按鈕,按住不動會發現只輸出了“pressed”,直到放手彈起按鈕,纔會輸出“clicked”

    另外,如果在pressed 對應的槽函數中打斷點,會發現斷點運行後並不會執行“clicked”,這種情況跟我們在鼠標按下事件和鼠標彈起事件中同時打斷點的情況一樣,調試按下觸發的代碼後,彈起的事件代碼不會觸發。

  2. 再來看第二個問題
    幫助文檔裏面寫着按鈕狀態變化的時候,這個信號會觸發,所以這個信號觸發的前提是按鈕的Checkable屬性要設置成true,這樣在點擊按鈕之後就會觸發toggled信號

    測試代碼如下:

    QObject::connect( ui->pushButton,&QToolButton::toggled,[](bool b){
        qDebug()<<"toggled"<<b;
    });
    ui->pushButton->setCheckable(true);
    

那麼還有一個問題 pressed和clicked,和toggled 的先後順序又是怎樣的,我們將兩段測試代碼同時添加,運行之後點擊按鈕,結果:

Debugging starts
pressed
toggled true
clicked
pressed
toggled false
clicked
pressed
toggled true
clicked
...

結論:

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

作者:伐羅密
鏈接:https://www.jianshu.com/p/2c4e35a6ed72
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章