• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
sn-genuine
博客园    首页    新随笔    联系   管理    订阅  订阅

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.学习控件的技巧

  1. 不需要死记全部API,记住类名,使用Qt帮助文档F1随时查阅
  2. 学习控件优先看:信号与槽,其次看公共成员函数
  3. UI设计师界面可以直接修改控件属性,等价于写代码调用setXXX

面试高频考点总结

  1. QAbstractButton是所有按钮基类,toggled信号只有checkable=true才会触发。
  2. QToolButton菜单三个弹出模式区别,默认DelayedPopup长按弹出,很多人踩坑。
  3. InstantPopup模式,点击按钮不会触发clicked信号,直接弹出菜单。
  4. setDefaultAction:把QAction绑定到QToolButton,按钮复用action图标文字,点击触发triggered(QAction*)信号。
posted on 2026-09-03 20:22  SobNov  阅读(3)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3