Qt按钮控件(QAbstractButton、QPushButton、QToolButton )
Qt按钮控件笔记
继承关系
graph TD
QWidget --> QAbstractButton
QAbstractButton --> QPushButton
QAbstractButton --> QToolButton
QAbstractButton --> QRadioButton
QAbstractButton --> QCheckBox
QAbstractButton:所有按钮的抽象基类,大部分按钮公共API、信号都在这里定义。
1. QAbstractButton 基类公共API
公共成员函数
// 设置按钮显示文本
void setText(const QString &text);
// 获取按钮文本
QString text() const;
// 设置图标
void setIcon(const QIcon &icon);
QIcon icon() const;
// 设置图标大小
void setIconSize(const QSize &size);
QSize iconSize() const;
// 设置是否可勾选(开关按钮)
void setCheckable(bool);
bool isCheckable() const;
// 设置/获取选中状态
void setChecked(bool);
bool isChecked() const;
常用信号
// 点击释放后触发
[signal] void clicked(bool checked = false);
// 鼠标按下瞬间触发
[signal] void pressed();
// 鼠标松开瞬间触发
[signal] void released();
// checkable按钮状态切换时触发,携带选中bool状态
[signal] void toggled(bool checked);
2. QPushButton 普通按钮
继承
QAbstractButton,普通界面按钮。
// 构造函数
QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr);
QPushButton(const QString &text, QWidget *parent = nullptr);
QPushButton(QWidget *parent = nullptr);
// 设置默认按钮(对话框按Enter自动触发)
void setDefault(bool);
bool isDefault() const;
// 给按钮绑定菜单
void setMenu(QMenu *menu);
// 弹出菜单
[slot] void showMenu();
3. QToolButton 工具按钮(重点)
增强版按钮,多用于工具栏;支持图标文字多种排版、绑定弹出菜单、箭头样式。
3.1 常用API
//构造
QToolButton(QWidget *parent = nullptr);
//关联QAction,按钮直接复用action的图标、文字、信号
[slot] void setDefaultAction(QAction *action);
QAction* defaultAction() const;
// 设置箭头图标
void setArrowType(Qt::ArrowType type);
Qt::ArrowType arrowType() const;
// 设置图标文字排版样式
[slot] void setToolButtonStyle(Qt::ToolButtonStyle style);
Qt::ToolButtonStyle toolButtonStyle() const;
//绑定菜单
void setMenu(QMenu *menu);
QMenu* menu() const;
// 设置菜单弹出模式【高频坑点】
void setPopupMode(QToolButton::ToolButtonPopupMode mode);
QToolButton::ToolButtonPopupMode popupMode() const;
//手动弹出菜单
[slot] void showMenu();
枚举1:Qt::ToolButtonStyle 图标文字排布
| 枚举 | 效果 |
|---|---|
Qt::ToolButtonIconOnly |
只显示图标,不显示文字 |
Qt::ToolButtonTextOnly |
只显示文字,不显示图标 |
Qt::ToolButtonTextBesideIcon |
文字在图标右侧 |
Qt::ToolButtonTextUnderIcon |
文字在图标下方 |
Qt::ToolButtonFollowStyle |
跟随系统默认样式 |
枚举2:QToolButton::ToolButtonPopupMode 菜单弹出模式(重点面试)
| 枚举 | 行为 |
|---|---|
QToolButton::DelayedPopup 默认 |
长按按钮才弹出菜单;单击触发clicked信号,这就是踩坑点! |
QToolButton::MenuButtonPopup |
按钮右侧出现小箭头;点箭头弹出菜单,点按钮本体触发clicked信号 |
QToolButton::InstantPopup |
单击按钮立刻弹出菜单;⚠️此时不会触发clicked信号 |
💡坑:不写
setPopupMode,默认DelayedPopup,必须长按才出菜单,单击没反应。
枚举3:Qt::ArrowType 箭头类型
Qt::NoArrow //无箭头
Qt::UpArrow //向上箭头
Qt::DownArrow //向下箭头
Qt::LeftArrow //向左箭头
Qt::RightArrow //向右箭头
3.2 额外信号
// setDefaultAction绑定action之后,点击会触发,携带当前QAction*
void triggered(QAction *action);
完整demo代码
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QDebug>
#include <QMenu>
#include <QAction>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1.普通QToolButton按钮
ui->normalBtn->setText("我是个屌丝");
ui->normalBtn->setIcon(QIcon(":/img/aLS7Z596h012eZB.thumb.400_0.png"));
ui->normalBtn->setIconSize(QSize(20,20));
connect(ui->normalBtn,&QToolButton::clicked,this,[=](){
qDebug()<<"我是一个普通按钮,是一个屌丝...";
});
ui->normalBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
// 2.setDefaultAction绑定QAction
QAction* actBtn = new QAction(QIcon(":/img/aLS7Z596h012eZB.thumb.400_0.png"),"奥利给");
ui->actionBtn->setDefaultAction(actBtn);
connect(ui->actionBtn,&QToolButton::triggered,this,[=](QAction* act){
act->setText("我是修改之后的马里奥");
act->setIcon(QIcon(":/img/beee18da33f1d5fc270225ecff31001b43dd5632d331-aS3E8A_fw658.webp"));
ui->actionBtn->setIconSize(QSize(20,20));
});
ui->actionBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
//3.箭头按钮
ui->arrowBtn->setArrowType(Qt::UpArrow);
ui->arrowBtn->setText("向上");
ui->arrowBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
//4.checkable开关按钮
ui->checkedBtn->setCheckable(true);
connect(ui->checkedBtn,&QToolButton::toggled,this,[=](bool ok){
qDebug()<<"我是一个checked按钮,当前状态为:"<<ok;
});
//5.绑定菜单:坑!默认DelayedPopup,长按才弹出
ui->menuBtn->setText("你喜欢什么萝莉?");
QMenu* menu = new QMenu;
QAction* act = menu->addAction("可爱的");
menu->addAction("幼态的");
ui->menuBtn->setMenu(menu);
// 想要单击弹出,必须加这一行
// ui->menuBtn->setPopupMode(QToolButton::InstantPopup);
connect(act,&QAction::triggered,this,[=](){
qDebug()<<"我喜欢可爱萝莉!!!";
});
//6.MenuButtonPopup模式:按钮本体可点击,右侧小箭头弹菜单
ui->popmenu->setMenu(menu);
ui->popmenu->setPopupMode(QToolButton::MenuButtonPopup);
connect(ui->popmenu,&QToolButton::clicked,this,[=](){
qDebug()<<"我是popMenu按钮,好痒啊...";
});
}
MainWindow::~MainWindow()
{
delete ui;
}
内存提示:
setMenu(menu)之后,menu交给工具按钮对象树管理,不需要手动delete。
4.学习控件的技巧
- 不需要死记全部API,记住类名,使用Qt帮助文档
F1随时查阅 - 学习控件优先看:信号与槽,其次看公共成员函数
- UI设计师界面可以直接修改控件属性,等价于写代码调用setXXX
面试高频考点总结
QAbstractButton是所有按钮基类,toggled信号只有checkable=true才会触发。QToolButton菜单三个弹出模式区别,默认DelayedPopup长按弹出,很多人踩坑。InstantPopup模式,点击按钮不会触发clicked信号,直接弹出菜单。setDefaultAction:把QAction绑定到QToolButton,按钮复用action图标文字,点击触发triggered(QAction*)信号。
浙公网安备 33010602011771号