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最后執行,相當于彈起操作
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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