PushButton顧名思義----按鈕,也是Qt常用的控件之一,至於應用場景,就不必多說了,下面將從以下幾個方面對QPushButton進行介紹:
[1]常用屬性介紹
[2]信號事件
[3]快捷鍵設置
針對QPushButton還會用到對其背景顏色、圓角邊框、漸變顯示效果、鼠標懸停與鼠標離開的不同顯示效果、用圖片代替QPushButton進行顯示等美化相關的屬性進行設置。這些全部用Qt Style Sheet即可完成,Qt Style Sheet不在本章的講解範圍內,後面會專門講解。
常用屬性介紹:
是否可被選擇,該屬性默認關閉
void setCheckable(bool)
如果該屬性被設置爲true,則該Button具有可選擇的屬性。點擊一下將會置爲選擇狀態,再點擊一次取消選擇(可以看做是一個單選或多選框)。
處於被選擇狀態的PushButton
設置排他性
void setAutoExclusive(bool)
如果有多個PushButton設置了可選擇屬性和排他屬性,則在同一個widget下的PushButton默認情況下最多只能有一個被選則(類似於單選框)。
下面的兩個按鈕在設置了可選擇以及排他性的情況下,默認只能有一個被選中。
接下來我們再拖動兩個PushButton,並分別打開排他性和可選擇:
默認情況下,這4個按鈕相互排斥。如果想要實現1,2爲一組並且相互排斥,3,4爲一組並且相互排斥,1,3, 1,4 2,3 2,4相互之間不影響,在這裏提供兩種方法:
[1]分別放到兩個Widget中
運行結果如下:
[2]設置QButtonGroup
在構造函數中添加以下代碼:
QButtonGroup *bg1 = new QButtonGroup(this);
QButtonGroup *bg2 = new QButtonGroup(this);
bg1->addButton(ui->pushButton_1);
bg1->addButton(ui->pushButton_2);
bg2->addButton(ui->pushButton_3);
bg2->addButton(ui->pushButton_4);
該方法的原理是將b1、b2設置爲1組將b3、b4設置爲一組。這樣兩組之間不會相互影響。
信號事件:
QPushButton的信號事件有下面這幾個:
[signal] void QAbstractButton::clicked()
[signal] void QAbstractButton::clicked(bool checked = false)
[signal] void QAbstractButton::pressed()
[signal] void QAbstractButton::released()
[signal] void QAbstractButton::toggled(bool checked)
clicked()和clicked(bool checked = false)信號:在按鈕被點擊時觸發,兩者的區別是一個會傳遞是否被選擇的狀態,一個不會。通常情況下,如果按鈕沒有打開可被選擇的屬性,兩者無任何區別(checked等於false)。
pressed()信號:在按下時觸發
released()信號:在鬆開時觸發
toggled:按鈕選擇狀態被改變時觸發(未被選擇----被選擇、被選擇----未被選擇),要想能觸發此信號,需要先打開可被選擇的屬性
接下來通過代碼來演示:
聲明槽函數:
public slots:
void Clicked();
void Clicked(bool checked);
void Pressed();
void Released();
void Toggled(bool checked);
函數具體定義:
void Widget::Clicked()
{
qDebug() << "Clicked";
}
void Widget::Clicked(bool checked)
{
qDebug() << "Clicked:" << checked;
}
void Widget::Pressed()
{
qDebug() << "Pressed";
}
void Widget::Released()
{
qDebug() << "Released";
}
void Widget::Toggled(bool checked)
{
qDebug() << "Toggled:" << checked;
}
在設計器中新拖動兩個按鈕,一個默認屬性(不可被選擇)、一個設置了可被選擇屬性:
並分別進行信號與槽的綁定:
當兩次點擊不可被選擇的按鈕時的運行效果:
可以看到clicked信號所傳遞的checked總爲false,並且toggled信號不會被觸發
當兩次點擊可選擇按鈕時的運行效果:
可以看到clicked信號所傳遞的checked在按鈕被選擇時爲true,在取消選擇時爲false,此時toggled也被觸發了,且現象和clicked信號一致。
其實,對於可選擇的按鈕來說,兩者是有區別的。Clicked信號只能在用戶在界面上觸發,而toggled信號是隻要選擇狀態改變就會觸發(無論是在程序裏改變還是在用戶界面上改變)
驗證:
在構造函數中設置按鈕爲選擇狀態:
ui->pushButtonCheckable->setChecked(true);
程序運行時的效果:
小結:如果想要在按鈕選擇狀態改變時就觸發信號,而不分是用戶改變的還是程序改變的時,則使用toggled信號。如果只響應用戶在界面上的操作導致按鈕選擇狀態改變時,則使用clicked信號。對可選擇的按鈕來說,toggled信號更容易觸發。
快捷鍵設置
直接以後來新加的"不可被選擇"的按鈕爲例進行快捷鍵設置的講解。
直接在ui設計器的屬性欄設置shortcut屬性:
此時在鍵盤中使用Ctrl+k快捷鍵時和用鼠標點擊的效果一致。
用代碼的方式實現:
pushButtonNoCheckable->setShortcut(QApplication::translate("Widget", "Ctrl+K", nullptr));