QPushButton 點(diǎn)擊信號(hào)分析
QPushButton有三個(gè)很重要的信號(hào)跟點(diǎn)擊有關(guān)
- pressed
- clicked
- toggled
表面上看,pressed和clicked都會(huì)在點(diǎn)擊按鈕時(shí)觸發(fā),它們有什么區(qū)別呢?toggled好像有時(shí)候觸發(fā),有時(shí)候不觸發(fā),到底怎么回事呢?下面就一起聊一下這三個(gè)信號(hào)
首先,這三個(gè)信號(hào)都是從QAbstractButton繼承來(lái)的,也就是說(shuō),下面情況對(duì)QAbstractButton的所有子類都適用,
-
先來(lái)看第一個(gè)問題
pressed和clicked,可以編寫一段代碼來(lái)測(cè)試一下QObject::connect( ui->pushButton,&QToolButton::clicked,[]{ qDebug()<<"clicked"; }); QObject::connect( ui->pushButton,&QToolButton::pressed,[]{ qDebug()<<"pressed"; });運(yùn)行后點(diǎn)擊按鈕,結(jié)果為
Debugging starts pressed clicked pressed clicked pressed clicked也就是說(shuō)pressed先觸發(fā)(按下),clicked后觸發(fā)(彈起),而且如果將鼠標(biāo)按壓按鈕,按住不動(dòng)會(huì)發(fā)現(xiàn)只輸出了“pressed”,直到放手彈起按鈕,才會(huì)輸出“clicked”
另外,如果在pressed 對(duì)應(yīng)的槽函數(shù)中打斷點(diǎn),會(huì)發(fā)現(xiàn)斷點(diǎn)運(yùn)行后并不會(huì)執(zhí)行“clicked”,這種情況跟我們?cè)谑髽?biāo)按下事件和鼠標(biāo)彈起事件中同時(shí)打斷點(diǎn)的情況一樣,調(diào)試按下觸發(fā)的代碼后,彈起的事件代碼不會(huì)觸發(fā)。
-
再來(lái)看第二個(gè)問題
幫助文檔里面寫著按鈕狀態(tài)變化的時(shí)候,這個(gè)信號(hào)會(huì)觸發(fā),所以這個(gè)信號(hào)觸發(fā)的前提是按鈕的Checkable屬性要設(shè)置成true,這樣在點(diǎn)擊按鈕之后就會(huì)觸發(fā)toggled信號(hào)測(cè)試代碼如下:
QObject::connect( ui->pushButton,&QToolButton::toggled,[](bool b){ qDebug()<<"toggled"<<b; }); ui->pushButton->setCheckable(true);
那么還有一個(gè)問題 pressed和clicked,和toggled 的先后順序又是怎樣的,我們將兩段測(cè)試代碼同時(shí)添加,運(yùn)行之后點(diǎn)擊按鈕,結(jié)果:
Debugging starts
pressed
toggled true
clicked
pressed
toggled false
clicked
pressed
toggled true
clicked
...
結(jié)論:
- pressed最先執(zhí)行,相當(dāng)于按下操作
- 按下之后,按鈕狀態(tài)發(fā)生變化,觸發(fā)toggled
- clicked最后執(zhí)行,相當(dāng)于彈起操作