基本Widgets(04):【類】QPushButton [官翻]
技術標籤:Qt
文章目錄
QPushButton Class
QCheckBox小部件提供了一個帶有文字標籤的複選框。
Header | #include < QPushButton > |
---|---|
qmake | QT += widgets |
Inherits | QAbstractButton |
Inherited By | QCommandLinkButton |
詳細說明
按鈕或命令按鈕可能是任何圖形使用者介面中最常用的小部件。按下(單擊)按鈕來命令計算機執行某些操作或回答一個問題。典型的按鈕有“OK”、“應用”、“取消”、“關閉”、“是”、“否”和“幫助”。
命令按鈕是矩形的,通常顯示一個描述其操作的文字標籤。可通過在文字中首選字元前加一個&號來指定快捷鍵。例如:
QPushButton *button = new QPushButton("&Download", this);
在這個例子中,快捷鍵是Alt+D。有關詳細資訊,請參閱【QShortcut】文件(要顯示實際的’&&’)。
按鈕顯示一個文字標籤,也可以顯示一個小圖示。這些可以使用建構函式進行設定,稍後使用setText()和setIcon()進行更改。如果按鈕是禁用的,文字和圖示的外觀將根據GUI樣式進行操作,使按鈕看起來“禁用”。
當按鈕被滑鼠、空格鍵或鍵盤快捷鍵啟用時,它會發出click()訊號。連線到這個訊號來執行按鈕的操作。按鈕也提供了一些不常用的訊號,例如pressed()和release()。
對話方塊中的命令按鈕是預設的自動預設按鈕,也就是說,當它們接收到鍵盤輸入焦點時,它們會自動成為預設的按鈕。預設按鈕是當用戶在對話方塊中按下Enter或Return鍵時啟用的按鈕。你可以用setAutoDefault()來改變它。注意,自動預設按鈕保留了一點額外的空間,這是繪製預設按鈕指示器所必需的。如果你不想在按鈕周圍留下空格,呼叫setAutoDefault(false)。
在過去的十年中,作為核心的按鈕小部件已經發展到可以容納許多變化。微軟風格指南現在顯示了大約10種不同的Windows按鈕狀態,文字暗示,如果考慮到所有的功能組合,還會有幾十種不同的狀態。
最重要的模式或狀態是:
- 可用或不可用(灰色顯示,禁用)
- 標準按鈕,切換按鈕或選單按鈕
- 開啟或關閉(僅用於切換按鈕)
- 預設或正常。對話方塊中的預設按鈕通常可以使用回車鍵或回車鍵“點選”
- 自動重複或不重複
- 按下或沒按下
一般來說,當應用程式或對話方塊視窗在使用者單擊它時執行某個操作(比如Apply、Cancel、Close和Help),以及小部件應該具有一個寬的、帶有文字標籤的矩形時,應該使用按鈕。改變視窗狀態而不是執行操作的小的、典型的正方形按鈕(例如QFileDialog右上角的按鈕)不是命令按鈕,而是工具按鈕,Qt為這些按鈕提供了一個特殊的類(QToolButton)。
如果您需要切換行為(參見setCheckable())或在被按下時自動重複啟用訊號的按鈕(如滾動條中的箭頭)(參見setAutoRepeat()),命令按鈕可能不是您想要的。當有疑問時,使用工具按鈕。
注意:在macOS上,當按鈕的寬度小於50或高度小於30時,按鈕的角會從圓形變為正方形。使用setMinimumSize()函式來防止這種行為。
命令按鈕的變體是選單按鈕。它們提供的不是一個命令,而是多個命令,因為當單擊它們時,它們會彈出一個選項選單。使用setMenu()方法將彈出選單與按鈕相關聯。
其他型別的按鈕是選項按鈕(參見QRadioButton)和複選框(參見QCheckBox)。
在Qt中,QAbstractButton基類提供了大部分模式和其他API,而QPushButton提供了GUI邏輯。有關API的更多資訊,請參見QAbstractButton。
屬性
-
autoDefault: bool 按鈕是否為自動預設按鈕
在一些GUI樣式中,一個預設的按鈕被畫在一個額外的框架周圍,最多3個畫素或更多。Qt會自動保留自動預設按鈕周圍的空間,也就是說,自動預設按鈕可能會有一個稍大的尺寸提示。對於有QDialog父類的按鈕,該屬性的預設值為true;否則預設為false。
有關default和auto-default如何互動的詳細資訊,請參閱default屬性。
訪問函式:
- bool autoDefault() const
- void setAutoDefault(bool)
-
default: bool 按鈕是否為預設按鈕
Default和autodefault按鈕決定當使用者在對話方塊中按下enter鍵時會發生什麼。將這個屬性設定為true的按鈕(即對話方塊的預設按鈕)會在使用者按下enter鍵時自動被按下,但有一個例外:如果autoDefault按鈕當前有焦點,就會按下autoDefault按鈕。當對話方塊有自動預設按鈕但沒有預設按鈕時,按下enter鍵將會按下當前有焦點的自動預設按鈕,或者如果沒有按鈕有焦點,則會按下焦點鏈中的下一個自動預設按鈕。
在對話方塊中,一次只能有一個按鈕是預設按鈕。然後,該按鈕與一個額外的框架一起顯示(取決於GUI樣式)。
預設的按鈕行為只在對話方塊中提供。當按鈕有焦點時,總是可以通過按空格鍵從鍵盤上單擊按鈕。當對話方塊是可見的時候,如果當前預設按鈕的預設屬性設定為false,那麼下次對話方塊中的按鈕接收焦點時,將自動分配一個新的預設值。
該屬性的預設值為false。
訪問函式:
- bool isDefault() const
- void setDefault(bool)
-
flat: bool 按鈕邊框是否凸起
該屬性的預設值為false。
如果設定了此屬性,大多數樣式將不會繪製按鈕背景,除非按鈕被按下。setAutoFillBackground()可用於確保使用QPalette::Button畫筆填充背景。訪問函式:
- bool isFlat() const
- void setFlat(bool)
公共函式
構造析構
- QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr)
- QPushButton(const QString &text, QWidget *parent = nullptr)
- QPushButton(QWidget *parent = nullptr)
- virtual ~QPushButton()
屬性
- bool autoDefault() const
- void setAutoDefault(bool)
- bool isDefault() const
- void setDefault(bool)
- bool isFlat() const
- void setFlat(bool)
選單
- QMenu * menu() const
- void setMenu(QMenu *menu) 將彈出選單選單與這個按鈕相關聯
把按鈕變成選單按鈕,在某些樣式中,選單按鈕將在按鈕文字的右側產生一個小三角形。選單的所有權沒有轉移到按鈕。
按Fusion小部件風格顯示的帶有彈出選單的按鈕。
重新實現的公共函式
- virtual QSize minimumSizeHint() const override
- virtual QSize sizeHint() const override
公共槽
- void showMenu() 顯示(彈出)相關的彈出選單
如果沒有這樣的選單,這個函式將什麼也不做。這個函式直到彈出選單被使用者關閉才會返回。
受保護的函式
- void initStyleOption(QStyleOptionButton *option) const 使用來自這個QPushButton的值初始化選項
當子類需要QStyleOptionButton,但又不想自己填寫所有資訊時,這個方法非常有用。
重新實現的受保護的函式
- virtual bool event(QEvent *e) override
- virtual void focusInEvent(QFocusEvent *e) override
- virtual void focusOutEvent(QFocusEvent *e) override
- virtual bool hitButton(const QPoint &pos) const override
- virtual void keyPressEvent(QKeyEvent *e) override
- virtual void paintEvent(QPaintEvent *) override
例項
#include <QtWidgets>
#include "Widget.h"
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QWidget w;
QPushButton btn("&Download",&w);
btn.setAutoFillBackground (true);
btn.setFlat (true);
QPalette palette = btn.palette ();
palette.setColor (QPalette::Background,Qt::red);
palette.setColor (QPalette::Button,Qt::green);
btn.setPalette (palette);
QObject::connect (&btn,&QAbstractButton::clicked ,[&]{
qDebug() << btn.text ();
});
QMenu btnMenu("File");
btnMenu.setPalette (palette);
btnMenu.addAction ("開啟");
btnMenu.addAction ("關閉");
btnMenu.addAction ("儲存");
btn.setMenu (&btnMenu);
w.show ();
app.exec();
return 0;
}