详细描述
QPushButton 小部件提供一个命令按钮。
下压按钮或者说命令按钮可能是最在图形用户界面最常用到的小部件了。下压(点击)一个按钮去命令计算机去执行一些操作,或者去回答一个问题。典型的按钮时OK,Apply,Cancel,Close,Yes,No,Help.
一个命令按钮是矩形的,通常显示一个描述其操作的文本。可以通过在文本中使用'&'紧接的字符来指定快捷键。
例如:
QPushButton *button = new QPushButton("&Download", this);
在这个例子中快捷键是
Alt+D。
下压按钮呢显示一个文本标签,或者也可显示一个小图标。这些可以使用构造器来设置同时也可以使用setText()和setIcon()在之后更改。如果按钮被禁用,文本和图标的外观将会被操作以使按钮 的GUI风格看起来像“按钮被禁用了”(当然这个时候点击按钮是不会发射点击信号的)。
当下压按钮被鼠标,空格键或者键盘快捷键激活会发射clicked()信号,连接到这个信号以执行按钮的动作。下压按钮也提供较少使用的信号,例如:pressed()和released()。
对话框中的命令按钮默认为自动默认按钮,也就是说,当他们接收键盘的输入焦点时,它们自动成为默认的按钮。默认按钮是当用户在对话框中按下回车键或者返回键是被激活的下压按钮。你可以使用setAutoDefault()来改变它。注意,自动默认按钮保留了一个额外的空间,这是绘制默认按钮指示器的必要条件。如果你不想要这个空间围绕着你的按钮,调用setAutoDefault(false)。
在过去十年里,按钮小部件变得如此重要,可以容纳如此多的变化。
微软风格指南现在展示了10个不同状态的Windows 下压按钮,而文本暗示,当考虑到所有的功能组合时,会有更多的状态。
最重要的模式或状态是:
*可用或不可用(灰色的,禁用的)
*标准按钮,切换按钮或者菜单按钮
*开启或关闭(仅限于切换按钮)
*默认按钮或者普通按钮。对话框中的默认按钮通常可以使用回车键或返回键被点击
*自动重复与否
*按下与否
作为一般规则,当应用程序或对话框窗口执行操作时,当用户单击它(例如应用、取消、关闭和帮助)时,当小部件应该具有一个宽的矩形的文本标签时,使用下压按钮。小的,典型的方形按钮改变窗口状态,而不是执行操作(如QFileDialog右上角的按钮)不是命令按钮,而是工具按钮。Qt为这些按钮提供一个特殊的类(QToolButton)。
如果您需要切换行为(请参见setCheckable())或一个按钮,当被向下推送时自动重复激活信号(见setAutoRepeat()),命令按钮可能不是您想要的。当有疑问时,使用工具按钮。
一个命令按钮的变体是一个菜单按钮。它们不仅提供一个命令,而且还提供多个命令,因为当它们被单击时,它们弹出一个选项菜单。使用方法setMenu()将弹出式菜单与下压按钮关联在一起。
其他类型的按钮是选项按钮(参见QRadioButton)和复选框(参见QCheckBox)。
相关成员
autoDefault : bool
此属性保存按钮是否为自动默认按钮。
如果此属性设置为true,则按钮是自动默认按钮。
在一些GUI样式中,默认的按钮被画成一个额外的帧,最多3个像素或更多。Qt自动保持这个空间的自动默认按钮,也就是。自动默认按钮可能有稍微大一点的提示。
flat : bool
此属性保存按钮边界是否凸起。
此属性的缺省值为false。如果设置此属性,则大多数样式将不会绘制按钮背景,除非按下按钮。可以使用setAutoFillBackground()来确保背景填充使用QPalette::Button 画刷。
相关API
QPushButton::QPushButton(QWidget *parent = Q_NULLPTR)
构造一个没有文本,父对象为parent的下压按钮。
QPushButton::QPushButton(const QString &text, QWidget *parent = Q_NULLPTR)
构造一个父对象为parent,文本内容为text的下压按钮。
QPushButton::QPushButton(const QIcon &icon, const QString &text, QWidget *parent = Q_NULLPTR)
构造一个带有图标icon,文本text,父对象为parent的下压按钮。
注意:你也可以穿递一个QPixmap对象作为一个图标(icon)(由于C++提供的隐式类型转换)。
[protected] void QPushButton::initStyleOption(QStyleOptionButton *option) const
用这个QPushButton的值初始化选项。这种方法在需要QStyleOptionButton时用于子类,但不希望自己填充所有信息。
QMenu *QPushButton::menu() const
返回按钮相关联的弹出菜单,如果没有设置弹出菜单则返回0。
void QPushButton::setMenu(QMenu *menu)
将弹出菜单menu和下压按钮关联起来。
这就把按钮变成了一个菜单按钮,在某些样式中,它会在按钮的文本右边产生一个小的三角形。
菜单的所有权没有转移到按钮上。
[slot] void QPushButton::showMenu()
显示(弹出)相关的弹出菜单。如果没有这样的菜单,这个函数什么也不做。这个函数直到弹出菜单被用户关闭后才返回。
示例程序
运行演示截屏:
代码解析:
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QWidget>
#include <QPushButton>
#include <QAction>
class Dialog : public QWidget
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
QSize sizeHint();
private:
QPushButton* m_stateBtn;
QPushButton* m_cmdBtn;
void createMenu();
private slots:
void onCmdBtnClicked();
void onMenuTriggerred(QAction* action);
};
#endif // DIALOG_H
头文件声明两个命令按钮指针和相关成员函数和槽函数:重写sizeHint()虚函数给当前的对话框一个建议的大小(宽和高);createMenu()函数主要用于创建状态按钮弹出的下拉菜单;槽函数onCmdBtnClicked()和onMenuTriggerred()主要用于响应命令按钮的点击信号和下拉菜单选项选中触发的信号。
dialog.cpp
#include "dialog.h"
#include <QDebug>
#include <QMenu>
Dialog::Dialog(QWidget *parent)
: QWidget(parent)
{
setMinimumSize(300,400);
setWindowTitle("按钮对话框");
m_cmdBtn = new QPushButton("&Command Button",this);
m_cmdBtn->move(20,50);
m_stateBtn = new QPushButton("&State",this);
m_stateBtn->move(130,50);
//m_stateBtn->setAutoDefault(true);
createMenu();
connect(m_cmdBtn,SIGNAL(clicked()),this,SLOT(onCmdBtnClicked()));
}
Dialog::~Dialog()
{
}
void Dialog::createMenu()
{
QMenu* menu = new QMenu;
menu->addAction(QIcon(":online.png"),"我在线上");
menu->addAction(QIcon(":qwoba.png"),"Q我吧");
menu->addAction(QIcon(":leave.png"),"离开");
menu->addAction(QIcon(":busy.png"),"忙碌");
menu->addAction(QIcon(":nodisturb.png"),"请勿打扰");
menu->addAction(QIcon(":hide.png"),"隐身");
menu->addAction(QIcon(":offline.png"),"离线");
menu->addAction("添加状态信息");
menu->addSeparator();
menu->addAction("关闭所有声音");
menu->addAction("关闭头像闪动");
menu->addSeparator();
menu->addAction(QIcon(":lock.png"),"锁定QQ Ctrl+Alt+L");
menu->addSeparator();
menu->addAction("打开主面板");
menu->addSeparator();
menu->addAction("退出");
m_stateBtn->setMenu(menu);
connect(menu,SIGNAL(triggered(QAction*)),this,SLOT(onMenuTriggerred(QAction*)));
}
QSize Dialog::sizeHint()
{
return QSize(600,600);
}
void Dialog::onCmdBtnClicked()
{
qDebug()<<"button clicked!"<<endl;
}
void Dialog::onMenuTriggerred(QAction *action)
{
m_stateBtn->setText(action->text());
}
源文件主要实现了头文件中声明的方法:命令按钮点击则打印“button click”文本并换行,菜单选项选中后则设置关联的状态按钮文本为对应选中项的文本。其他功能函数代码没有过于复杂的逻辑和算法,这里不多做解释,详见效果图和代码即可理解。
代码下载地址: QPushButton使用例子