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;
}