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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值