【Qt】QButtonGroup、QToolButton、QStackedWidget的常用用法
在Qt框架中,QButtonGroup
、QToolButton
和QStackedWidget
是三个常用的界面组件类,它们各自有独特的功能,且经常结合使用实现复杂交互。分别总结其常用方法如下:
一、QButtonGroup:按钮组管理类
概述
QButtonGroup
是一个逻辑管理类(非可视化组件),用于管理一组QAbstractButton
派生类(如QRadioButton
、QPushButton
、QToolButton
等)。它的核心作用是:
- 实现按钮间的互斥选择(类似单选按钮组);
- 为按钮分配唯一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(&类名::函数名)