编程语言
312
1. QPushButton
1.1 常用API
这种类型的按钮是Qt按钮中使用频率最高的一个, 对这个类进行操作, 大部分时候都需要使用它从父类继承过来的那些 API。 在
QPushButton
类中, 比较常用的一些API函数如下:
// 构造函数 /* 参数: - icon: 按钮上显示的图标 - text: 按钮上显示的标题 - parent: 按钮的父对象, 可以不指定 */ QPushButton::QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr); QPushButton::QPushButton(const QString &text, QWidget *parent = nullptr); QPushButton::QPushButton(QWidget *parent = nullptr); // 判断按钮是不是默认按钮 bool isDefault() const; // 一般在对话框窗口中使用, 将按钮设置为默认按钮, 自动关联 Enter 键 void setDefault(bool); /* 将弹出菜单菜单与此按钮关联起来。这将把按钮变成一个菜单按钮, 在某些样式中会在按钮文本的右边产生一个小三角形。 */ void QPushButton::setMenu(QMenu *menu); /* 显示(弹出)相关的弹出菜单。如果没有这样的菜单,这个函数什么也不做。 这个函数直到弹出菜单被用户关闭后才返回。 */ [slot] void QPushButton::showMenu();
1.2 按钮的使用
通过API的介绍, 我们可以知道, 使用
QPushButton
这种类型的按钮, 有三种使用方式:
- 作为普通按钮, 可以显示文本信息和图标
- 设置check属性, 使其可以处于持续的被选中状态
- 关联一个菜单, 点击按钮菜单弹出
具体操作可以参考如下代码:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 普通按钮, 没有checked属性 ui->normalBtn->setText("我是小猪佩奇"); ui->normalBtn->setIcon(QIcon(":/Peppa-Pig.png")); ui->normalBtn->setIconSize(QSize(30, 30)); connect(ui->normalBtn, &QPushButton::clicked, this, [=]() { qDebug() << "我是一个普通按钮, 图标是小猪佩奇..."; }); // 有checked属性的按钮 ui->checkedBtn->setCheckable(true); connect(ui->checkedBtn, &QPushButton::toggled, this, [=](bool bl) { qDebug() << "我是一个checked按钮, 当前状态为:" << bl; }); // 关联菜单 ui->menuBtn->setText("你喜欢哪种美女?"); QMenu* menu = new QMenu; QAction* act = menu->addAction("可爱的"); menu->addAction("粘人的"); menu->addAction("胸大的"); menu->addAction("屁股翘的"); ui->menuBtn->setMenu(menu); connect(act, &QAction::triggered, this, [=]{ qDebug() << "我是一个可爱的女人, 今晚约吗?"; }); }
2. QToolButton
2.1 常用API
这个类也是一个常用按钮类, 使用方法和功能跟
QPushButton
基本一致, 只不过在对于关联菜单这个功能点上,QToolButton
类可以设置弹出的菜单的属性, 以及在显示图标的时候可以设置更多的样式, 可以理解为是一个增强版的QPushButton
。 和QPushButton
类相同的是, 操作这个按钮使用的大部分函数都是从父类QAbstractButton
继承过来的。
///////////////////////////// 构造函数 ///////////////////////////// QToolButton::QToolButton(QWidget *parent = nullptr); /////////////////////////// 公共成员函数 /////////////////////////// /* 1. 将给定的菜单与此工具按钮相关联。 2. 菜单将根据按钮的弹出模式显示。 3. 菜单的所有权没有转移到“工具”按钮(不能建立父子关系) */ void QToolButton::setMenu(QMenu *menu); // 返回关联的菜单,如果没有定义菜单,则返回nullptr。 QMenu *QToolButton::menu() const; /* 弹出菜单的弹出模式是一个枚举类型: QToolButton::ToolButtonPopupMode, 取值如下: - QToolButton::DelayedPopup: - 延时弹出, 按压工具按钮一段时间后才能弹出, 比如:浏览器的返回按钮 - 长按按钮菜单弹出, 但是按钮的 clicked 信号不会被发射 - QToolButton::MenuButtonPopup: - 在这种模式下,工具按钮会显示一个特殊的箭头,表示有菜单。 - 当按下按钮的箭头部分时,将显示菜单。按下按钮部分发射 clicked 信号 - QToolButton::InstantPopup: - 当按下工具按钮时,菜单立即显示出来。 - 在这种模式下,按钮本身的动作不会被触发(不会发射clicked信号 */ // 设置弹出菜单的弹出方式 void setPopupMode(QToolButton::ToolButtonPopupMode mode); // 获取弹出菜单的弹出方式 QToolButton::ToolButtonPopupMode popupMode() const; /* QToolButton可以帮助我们在按钮上绘制箭头图标, 是一个枚举类型, 取值如下: - Qt::NoArrow: 没有箭头 - Qt::UpArrow: 箭头向上 - Qt::DownArrow: 箭头向下 - Qt::LeftArrow: 箭头向左 - Qt::RightArrow: 箭头向右 */ // 显示一个箭头作为QToolButton的图标。默认情况下,这个属性被设置为Qt::NoArrow。 void setArrowType(Qt::ArrowType type); // 获取工具按钮上显示的箭头图标样式 Qt::ArrowType arrowType() const; ///////////////////////////// 槽函数 ///////////////////////////// // 给按钮关联一个QAction对象, 主要目的是美化按钮 [slot] void QToolButton::setDefaultAction(QAction *action); // 返回给按钮设置的QAction对象 QAction *QToolButton::defaultAction() const; /* 图标的显示样式是一个枚举类型->Qt::ToolButtonStyle, 取值如下: - Qt::ToolButtonIconOnly: 只有图标, 不显示文本信息 - Qt::ToolButtonTextOnly: 不显示图标, 只显示文本信息 - Qt::ToolButtonTextBesideIcon: 文本信息在图标的后边显示 - Qt::ToolButtonTextUnderIcon: 文本信息在图标的下边显示 - Qt::ToolButtonFollowStyle: 跟随默认样式(只显示图标) */ // 设置的这个属性决定工具按钮是只显示一个图标、只显示文本,还是在图标旁边/下面显示文本。 [slot] void QToolButton::setToolButtonStyle(Qt::ToolButtonStyle style); // 返回工具按钮设置的图标显示模式 Qt::ToolButtonStyle toolButtonStyle() const; // 显示相关的弹出菜单。如果没有这样的菜单,这个函数将什么也不做。这个函数直到弹出菜单被用户关闭才会返回。 [slot] void QToolButton::showMenu();
2.2 按钮的使用
通过API的介绍, 我们可以知道, 使用QToolButton这种类型的按钮
- 作为普通按钮, 可以显示文本信息和图标
- 按钮的图标可以使用不同的方式设置, 并且制定图标和文本信息的显示模式
- 设置check属性, 使其可以处于持续的被选中状态
- 关联一个菜单, 点击按钮菜单弹出, 并且可以设置菜单的弹出方式
具体操作可以参考如下代码:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 普通按钮, 没有checked属性 ui->normalBtn->setText("我是个屌丝"); ui->normalBtn->setIconSize(QSize(50, 50)); ui->normalBtn->setIcon(QIcon(":/mario.png")); connect(ui->normalBtn, &QToolButton::clicked, this, [=]() { qDebug() << "我是一个普通按钮, 是一个屌丝..."; }); // 设置图标和文本的显示模式 ui->normalBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); // 基于QAction的方式给按钮设置图标和文本信息 QAction* actBtn = new QAction(QIcon(":/mushroom_life.png"), "奥利给"); ui->actionBtn->setDefaultAction(actBtn); connect(ui->actionBtn, &QToolButton::triggered, this, [=](QAction* act) { act->setText("我是修改之后的马里奥..."); act->setIcon(QIcon(":/mario.png")); }); // 设置图标和文本的显示模式 ui->actionBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 基于自带样式, 给按钮设置箭头图标 ui->arrowBtn->setArrowType(Qt::UpArrow); ui->arrowBtn->setText("向上"); // 设置图标和文本的显示模式 ui->arrowBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 有checked属性的按钮 ui->checkedBtn->setCheckable(true); connect(ui->checkedBtn, &QToolButton::toggled, this, [=](bool bl) { qDebug() << "我是一个checked按钮, 当前状态为:" << bl; }); // 关联菜单 ui->menuBtn->setText("你喜欢哪种美女?"); QMenu* menu = new QMenu; QAction* act = menu->addAction("可爱的"); menu->addAction("粘人的"); menu->addAction("胸大的"); menu->addAction("屁股翘的"); ui->menuBtn->setMenu(menu); connect(act, &QAction::triggered, this, [=]{ qDebug() << "我是一个可爱的女人, 今晚约吗?"; }); ui->popmenu->setMenu(menu); /* 弹出菜单的弹出模式是一个枚举类型: QToolButton::ToolButtonPopupMode, 取值如下: - QToolButton::DelayedPopup: - 延时弹出, 按压工具按钮一段时间后才能弹出, 比如:浏览器的返回按钮 - 长按按钮菜单弹出, 但是按钮的 clicked 信号不会被发射 - QToolButton::MenuButtonPopup: - 在这种模式下,工具按钮会显示一个特殊的箭头,表示有菜单。 - 当按下按钮的箭头部分时,将显示菜单。按下按钮部分发射 clicked 信号 - QToolButton::InstantPopup: - 当按下工具按钮时,菜单立即显示出来。 - 在这种模式下,按钮本身的动作不会被触发(不会发射clicked信号 */ ui->popmenu->setPopupMode(QToolButton::MenuButtonPopup); // 测试关联了菜单的按钮是否会发射clicked信号 connect(ui->popmenu, &QToolButton::clicked, this, [=]() { qDebug() << "我是popMenu按钮, 好痒呀..."; }); }