QPushButton 點(diǎn)擊信號(hào)分析

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的所有子類都適用,

  1. 先來(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ā)。

  2. 再來(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é)論:

  1. pressed最先執(zhí)行,相當(dāng)于按下操作
  2. 按下之后,按鈕狀態(tài)發(fā)生變化,觸發(fā)toggled
  3. clicked最后執(zhí)行,相當(dāng)于彈起操作
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這個(gè)例子相對(duì)綜合一些,包括qt的布局,實(shí)現(xiàn)無(wú)邊框效果,無(wú)邊框也就是沒有了窗口的title欄,沒有title欄就不能...
    用電熱毯烤豬閱讀 3,322評(píng)論 0 50
  • 摘要 上一章:[入門]GML常用UI之按鈕的制作1 本章涉及主要內(nèi)容:父對(duì)象的理解、與子對(duì)象的簡(jiǎn)單控制本章節(jié)實(shí)現(xiàn)內(nèi)...
    丿我回來(lái)了閱讀 707評(píng)論 0 0
  • 為什么在頭文件中有的是使用前置聲明,而有的是包含頭文件? 如下代碼: 前置聲明(forward declarati...
    Joe_HUST閱讀 1,447評(píng)論 0 6
  • 監(jiān)控你的想法防止非批判性默認(rèn)模式的掌控。當(dāng)你開始對(duì)一個(gè)人,一個(gè)人地方或一種情形形成印象時(shí),就遵循了古希臘哲學(xué)家E的...
    楊秀華閱讀 284評(píng)論 0 1
  • 薛兆豐在此之前出名的就是“春運(yùn)之說(shuō)”------08年雪災(zāi),關(guān)于春運(yùn)買票難,他發(fā)表了火車票應(yīng)該實(shí)行市場(chǎng)化漲價(jià),就是...
    薇薇董閱讀 136評(píng)論 0 0

友情鏈接更多精彩內(nèi)容