【Qt】QButtonGroup、QToolButton、QStackedWidget的常用用法

在Qt框架中,QButtonGroupQToolButtonQStackedWidget是三个常用的界面组件类,它们各自有独特的功能,且经常结合使用实现复杂交互。分别总结其常用方法如下:

一、QButtonGroup:按钮组管理类

概述

QButtonGroup是一个逻辑管理类(非可视化组件),用于管理一组QAbstractButton派生类(如QRadioButtonQPushButtonQToolButton等)。它的核心作用是:

  • 实现按钮间的互斥选择(类似单选按钮组);
  • 为按钮分配唯一ID,方便通过ID识别按钮;
  • 统一处理一组按钮的点击事件。
常用方法
方法功能
QButtonGroup(QObject *parent = nullptr)构造函数,指定父对象(自动管理生命周期)
void addButton(QAbstractButton *button, int id = -1)向组中添加按钮,并可指定唯一ID(默认自动分配)
void removeButton(QAbstractButton *button)从组中移除按钮
QAbstractButton *button(int id) const根据ID获取对应的按钮
int id(QAbstractButton *button) const获取指定按钮的ID
void setExclusive(bool exclusive)设置按钮是否互斥(默认true,仅对单选按钮生效;对普通按钮需手动开启)
QList<QAbstractButton *> buttons() const获取组中所有按钮
常用信号
信号触发时机
void buttonClicked(QAbstractButton *button)组中任意按钮被点击时,传递被点击的按钮指针
void buttonClicked(int id)组中任意按钮被点击时,传递被点击按钮的ID(更常用,避免指针操作)
void buttonToggled(QAbstractButton *button, bool checked)按钮状态切换时(如单选按钮选中/未选中)
典型用法

常用于管理单选按钮,实现“多选一”效果:

// 创建按钮组
QButtonGroup *group = new QButtonGroup(this);

// 创建单选按钮
QRadioButton *rb1 = new QRadioButton("选项1");
QRadioButton *rb2 = new QRadioButton("选项2");
QRadioButton *rb3 = new QRadioButton("选项3");

// 添加按钮到组(指定ID)
group->addButton(rb1, 1);
group->addButton(rb2, 2);
group->addButton(rb3, 3);

// 绑定点击事件(通过ID识别)
connect(group, QOverload<int>::of(&QButtonGroup::buttonClicked), 
        this, [=](int id){
    qDebug() << "选中了ID为" << id << "的选项";
});

二、QToolButton:工具按钮类

概述

QToolButton可视化按钮组件,继承自QAbstractButton,专为工具栏(QToolBar)设计。与普通QPushButton相比,它更适合显示图标(而非文字),支持快捷操作和弹出菜单,外观更紧凑。

常用特性
  • 以图标为主要显示内容(可配合文字);
  • 支持弹出菜单(如点击后显示下拉选项);
  • 可设置自动提升(鼠标悬停时高亮);
  • 常用于工具栏、状态栏等空间有限的区域。
常用方法
方法功能
QToolButton(QWidget *parent = nullptr)构造函数
void setIcon(const QIcon &icon)设置按钮图标(支持不同状态的图标,如选中、禁用)
void setText(const QString &text)设置按钮文字
void setToolTip(const QString &text)设置鼠标悬停时的提示文本
void setPopupMode(PopupMode mode)设置弹出模式(QToolButton::MenuButtonPopup:点击箭头显示菜单;QToolButton::InstantPopup:点击立即显示菜单)
void setMenu(QMenu *menu)关联一个菜单(配合setPopupMode使用)
void setIconSize(const QSize &size)设置图标大小
常用信号

继承自QAbstractButton,核心信号:

  • void clicked(bool checked = false):按钮被点击时触发;
  • void triggered(QAction *action):若按钮关联了QAction,动作触发时调用。
典型用法

在工具栏中添加带图标的工具按钮,并关联菜单:

// 创建工具栏
QToolBar *toolBar = new QToolBar(this);
addToolBar(toolBar); // 添加到主窗口

// 创建工具按钮
QToolButton *toolBtn = new QToolButton(this);
toolBtn->setIcon(QIcon(":/icons/edit.png")); // 设置图标(需提前准备资源文件)
toolBtn->setToolTip("编辑工具");
toolBtn->setIconSize(QSize(24, 24));

// 创建弹出菜单
QMenu *menu = new QMenu(this);
menu->addAction("复制");
menu->addAction("粘贴");
toolBtn->setMenu(menu);
toolBtn->setPopupMode(QToolButton::MenuButtonPopup); // 点击箭头显示菜单

// 添加到工具栏
toolBar->addWidget(toolBtn);

// 绑定点击事件
connect(toolBtn, &QToolButton::clicked, this, [](){
    qDebug() << "工具按钮被点击";
});

三、QStackedWidget:栈式窗口容器

概述

QStackedWidget容器类组件,用于管理多个子部件(QWidget),但同一时间仅显示一个子部件(类似“卡片切换”)。它本身不提供切换控件,需配合外部组件(如按钮、QButtonGroup)触发切换。

核心作用
  • 实现多页面切换(如设置面板的不同标签页内容);
  • 节省界面空间,通过逻辑切换展示不同内容;
  • 支持平滑过渡动画(需结合QPropertyAnimation)。
常用方法
方法功能
QStackedWidget(QWidget *parent = nullptr)构造函数
int addWidget(QWidget *widget)添加子部件,返回其索引(从0开始)
void removeWidget(QWidget *widget)移除子部件(不销毁,需手动管理)
int currentIndex() const获取当前显示部件的索引
QWidget *currentWidget() const获取当前显示的部件
void setCurrentIndex(int index)通过索引切换显示的部件
void setCurrentWidget(QWidget *widget)通过部件指针切换显示
int count() const获取子部件总数
QWidget *widget(int index) const根据索引获取子部件
常用信号
信号触发时机
void currentChanged(int index)当前显示的部件切换时,传递新索引
void widgetRemoved(int index)子部件被移除时,传递其原索引
典型用法

结合QButtonGroup实现按钮控制页面切换:

// 创建栈式窗口
QStackedWidget *stackedWidget = new QStackedWidget(this);

// 创建3个页面(子部件)
QWidget *page1 = new QWidget();
QWidget *page2 = new QWidget();
QWidget *page3 = new QWidget();
page1->setStyleSheet("background: red;"); // 简单区分页面
page2->setStyleSheet("background: green;");
page3->setStyleSheet("background: blue;");

// 添加页面到栈式窗口
stackedWidget->addWidget(page1); // 索引0
stackedWidget->addWidget(page2); // 索引1
stackedWidget->addWidget(page3); // 索引2

// 创建按钮组控制切换
QButtonGroup *btnGroup = new QButtonGroup(this);
QPushButton *btn1 = new QPushButton("页面1");
QPushButton *btn2 = new QPushButton("页面2");
QPushButton *btn3 = new QPushButton("页面3");
btnGroup->addButton(btn1, 0);
btnGroup->addButton(btn2, 1);
btnGroup->addButton(btn3, 2);

// 按钮点击时切换页面
connect(btnGroup, QOverload<int>::of(&QButtonGroup::buttonClicked), 
        stackedWidget, &QStackedWidget::setCurrentIndex);

// 布局管理(将按钮和栈式窗口组合)
QVBoxLayout *mainLayout = new QVBoxLayout(this);
QHBoxLayout *btnLayout = new QHBoxLayout();
btnLayout->addWidget(btn1);
btnLayout->addWidget(btn2);
btnLayout->addWidget(btn3);
mainLayout->addLayout(btnLayout);
mainLayout->addWidget(stackedWidget);
setLayout(mainLayout);

四、总结

  • QButtonGroup:管理按钮的逻辑容器,核心是“互斥”和“ID识别”,用于统一处理一组按钮的交互。
  • QToolButton:工具栏专用按钮,侧重图标显示和弹出菜单,适合快捷操作。
  • QStackedWidget:多页面容器,需配合外部控件切换,用于实现“单窗口多内容”的交互模式。

这三个类常组合使用(如QButtonGroup控制QStackedWidget切换,QToolButton作为切换按钮),实现紧凑且交互丰富的界面(如带侧边栏导航的堆叠容器部件)。

五、其它

QOverload:处理函数重载的“语法糖”

QOverload是 Qt 处理函数重载的 “语法糖”,其核心价值在于简化信号槽连接时对重载函数的版本指定,避免因编译器无法推断重载版本而导致的编译错误。掌握它能让 Qt 信号槽的使用更高效、代码更清晰。

语法:

QOverload<参数类型>::of(&类名::函数名)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油炸自行车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值