当前位置: 首页 > news >正文

【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(&类名::函数名)

http://www.dtcms.com/a/399384.html

相关文章:

  • QT:串口通信、串口发送与接收(2)
  • 【Unity 入门教程】一、前置工作
  • 北京网站建设公司空间续费北京建设工程施工司法解释
  • 需求收集不完整的常见原因有哪些
  • 论坛网站备案开发者选项在哪里打开vivo
  • 谈谈数组和链表的时间复杂度
  • ServletContex读取properties文件,中文乱码
  • todesk取消客户端开机自动启动后,开机仍然会启动客户端,怎么设置?
  • C++编程学习(第36天)
  • 如何快速处理电脑上常常遇到的各种小问题?
  • 卷积神经网络(CNN)的LeNet模型
  • 佛山网站外包什么是网站推广方案
  • 合肥门户网站制作建设佛山cms建站
  • Linux命令大全-usermod命令
  • Linux网络HTTP协议(上)
  • 开源 java android app 开发(十四)自定义绘图控件--波形图
  • umijs 4.0学习 - umijs 的项目搭建+自动化eslint保存+项目结构
  • 汇天网络科技有限公司苏州关键词优化软件
  • 制冷剂中表压对应温度值的获取(Selenium)
  • 建什么网站访问量高seo优化
  • 小型网站建设参考文献word超链接网站怎样做
  • 可视化 GraphRAG 构建的知识图谱 空谈版
  • 安装gitlab并上传本地项目
  • 黄页88网站免费推广网站大全网
  • 深圳附近建站公司做企业网站有什么工作内容
  • 新能源知识库(104)什么是FAT和SAT?
  • 多元函数可微性的完整证明方法与理解
  • 长春建站培训wordpress广告先显示
  • 怎么做网页版手机版网站百度竞价托管公司
  • 【寰宇光锥舟】Bash 脚本详细解释