1. 程式人生 > 其它 >基本Widgets(04):【類】QPushButton [官翻]

基本Widgets(04):【類】QPushButton [官翻]

技術標籤:Qt

文章目錄

QPushButton Class

QCheckBox小部件提供了一個帶有文字標籤的複選框。

Header#include < QPushButton >
qmakeQT += widgets
InheritsQAbstractButton
Inherited ByQCommandLinkButton

詳細說明

img

按鈕或命令按鈕可能是任何圖形使用者介面中最常用的小部件。按下(單擊)按鈕來命令計算機執行某些操作或回答一個問題。典型的按鈕有“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。

屬性

  1. autoDefault: bool 按鈕是否為自動預設按鈕
    在一些GUI樣式中,一個預設的按鈕被畫在一個額外的框架周圍,最多3個畫素或更多。Qt會自動保留自動預設按鈕周圍的空間,也就是說,自動預設按鈕可能會有一個稍大的尺寸提示。

    對於有QDialog父類的按鈕,該屬性的預設值為true;否則預設為false。

    有關default和auto-default如何互動的詳細資訊,請參閱default屬性。

    訪問函式:

    • bool autoDefault() const
    • void setAutoDefault(bool)
  2. default: bool 按鈕是否為預設按鈕
    Default和autodefault按鈕決定當使用者在對話方塊中按下enter鍵時會發生什麼。

    將這個屬性設定為true的按鈕(即對話方塊的預設按鈕)會在使用者按下enter鍵時自動被按下,但有一個例外:如果autoDefault按鈕當前有焦點,就會按下autoDefault按鈕。當對話方塊有自動預設按鈕但沒有預設按鈕時,按下enter鍵將會按下當前有焦點的自動預設按鈕,或者如果沒有按鈕有焦點,則會按下焦點鏈中的下一個自動預設按鈕。

    在對話方塊中,一次只能有一個按鈕是預設按鈕。然後,該按鈕與一個額外的框架一起顯示(取決於GUI樣式)。
    預設的按鈕行為只在對話方塊中提供。當按鈕有焦點時,總是可以通過按空格鍵從鍵盤上單擊按鈕。

    當對話方塊是可見的時候,如果當前預設按鈕的預設屬性設定為false,那麼下次對話方塊中的按鈕接收焦點時,將自動分配一個新的預設值。

    該屬性的預設值為false。

    訪問函式:

    • bool isDefault() const
    • void setDefault(bool)
  3. flat: bool 按鈕邊框是否凸起
    該屬性的預設值為false。
    如果設定了此屬性,大多數樣式將不會繪製按鈕背景,除非按鈕被按下。setAutoFillBackground()可用於確保使用QPalette::Button畫筆填充背景。

    訪問函式:

    • bool isFlat() const
    • void setFlat(bool)

公共函式

構造析構

  1. QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr)
  2. QPushButton(const QString &text, QWidget *parent = nullptr)
  3. QPushButton(QWidget *parent = nullptr)
  4. virtual ~QPushButton()

屬性

  1. bool autoDefault() const
  2. void setAutoDefault(bool)
  3. bool isDefault() const
  4. void setDefault(bool)
  5. bool isFlat() const
  6. void setFlat(bool)

選單

  1. QMenu * menu() const
  2. void setMenu(QMenu *menu) 將彈出選單選單與這個按鈕相關聯
    把按鈕變成選單按鈕,在某些樣式中,選單按鈕將在按鈕文字的右側產生一個小三角形。選單的所有權沒有轉移到按鈕。
    Screenshot of a Fusion style push button with popup menu.
    按Fusion小部件風格顯示的帶有彈出選單的按鈕。

重新實現的公共函式

  1. virtual QSize minimumSizeHint() const override
  2. virtual QSize sizeHint() const override

公共槽

  1. void showMenu() 顯示(彈出)相關的彈出選單
    如果沒有這樣的選單,這個函式將什麼也不做。這個函式直到彈出選單被使用者關閉才會返回。

受保護的函式

  1. void initStyleOption(QStyleOptionButton *option) const 使用來自這個QPushButton的值初始化選項
    當子類需要QStyleOptionButton,但又不想自己填寫所有資訊時,這個方法非常有用。

重新實現的受保護的函式

  1. virtual bool event(QEvent *e) override
  2. virtual void focusInEvent(QFocusEvent *e) override
  3. virtual void focusOutEvent(QFocusEvent *e) override
  4. virtual bool hitButton(const QPoint &pos) const override
  5. virtual void keyPressEvent(QKeyEvent *e) override
  6. 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;
}