【Qt】QToolBar、QToolButton的常用用法

一、QToolBar 常用用法

QToolBar 是 Qt 中用于创建工具栏的控件,可快速放置常用功能按钮、分隔符或自定义控件,并支持拖动停靠、浮动等特性。

1. 基础创建与添加到主窗口

// 在 QMainWindow 中创建工具栏
QToolBar *toolBar = new QToolBar(tr("主工具栏"), this);
addToolBar(toolBar); // 将工具栏添加到主窗口(默认停靠在顶部)

2. 添加动作(QAction)与控件

工具栏的核心元素是 QAction(可同时用于菜单和工具栏),也可直接添加自定义控件(如 QComboBoxQLineEdit)。

// 示例:添加“新建”“打开”动作 + 搜索框
QAction *actionNew = new QAction(tr("&New"), this);
QAction *actionOpen = new QAction(tr("&Open"), this);
toolBar->addAction(actionNew);   // 添加动作
toolBar->addAction(actionOpen);
toolBar->addSeparator();         // 添加分隔符

QLineEdit *searchBox = new QLineEdit();
searchBox->setPlaceholderText("搜索...");
toolBar->addWidget(searchBox);   // 添加自定义控件

3. 停靠与浮动控制

工具栏支持拖动到窗口的上、下、左、右区域,或脱离成为浮动窗口。

toolBar->setMovable(true);       // 允许拖动(默认 true)
toolBar->setFloatable(true);     // 允许浮动(默认 true)
toolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea); // 仅允许停靠在顶部/底部

设置初始停靠位置

m_pMainToolBar = new QToolBar(tr("MainToolBar"), this); // 先new出QToolBar实例
this->addToolBar(Qt::LeftToolBarArea, m_pMainToolBar);  // 传入默认停靠位置 Qt::LeftToolBarArea

注意:工具栏停靠位置只能在主窗口 add时进行设置,后边无法通过编码更改初始停靠位置。

4. 外观定制

控制图标大小、按钮文本与图标的布局、方向等。

toolBar->setIconSize(QSize(24, 24));  // 图标大小
toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 文本在图标下方
toolBar->setOrientation(Qt::Vertical); // 垂直排列(默认水平)

5. 信号与交互

响应工具栏动作的触发事件。

// 连接动作的 triggered 信号到槽函数
connect(actionOpen, &QAction::triggered, this, &MainWindow::openFile);

// 连接工具栏的 actionTriggered 信号(触发任意动作时发射)
connect(toolBar, &QToolBar::actionTriggered, this, &MainWindow::handleAction);

二、QToolButton 常用用法

QToolButton 是专为工具栏设计的按钮控件,比 QPushButton 更紧凑,支持图标、文本、下拉菜单、可切换状态等特性。

1. 基础创建与添加到工具栏

QToolButton *toolBtn = new QToolButton(this);
toolBtn->setIcon(QIcon(":/icons/save.png")); // 设置图标
toolBtn->setText("保存");                    // 设置文本
toolBar->addWidget(toolBtn);                 // 添加到工具栏

注意:toolButtonStyle 仅作用于工具栏自动生成的按钮(通过 addAction),手动添加的 QToolButtonaddWidget)需自行管理样式。详细解释如下:

1.1 两种添加方法的关键区别:样式继承机制

  • addAction 的按钮:
    • 工具栏内部为每个 QAction 生成一个 QToolButton,并将 toolButtonStyle(如 Qt::ToolButtonTextUnderIcon)强制应用到这些自动生成的按钮上。
    • 示例:
QAction* action = new QAction(QIcon("icon.png"), "按钮", this);

// 自动生成的 QToolButton 会继承 toolBar 的 toolButtonStyle
toolBar->addAction(action);  
  • addWidget**的按钮 :
    • 手动创建的 QToolButton(如 new QToolButton())是独立控件,工具栏的 toolButtonStyle 不会自动作用于它。
    • 原因:这些按钮可能已自定义样式(如设置了专属的图标、文本布局),Qt 避免强制覆盖用户的自定义逻辑。
    • 示例:
QToolButton* btn = new QToolButton();
btn->setToolButtonStyle(Qt::ToolButtonIconOnly); // 自定义样式
toolBar->addWidget(btn); // 工具栏的 toolButtonStyle 不会影响此按钮 
  • 如何让 addWidget 的按钮继承样式?

    若需手动添加的按钮(addWidget)也遵循工具栏的样式,需手动同步属性

// 工具栏样式设置
toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

// 手动创建按钮并同步样式 QToolButton* customBtn = new QToolButton();
customBtn->setToolButtonStyle(toolBar->toolButtonStyle()); // 显式继承
toolBar->addWidget(customBtn); 
  • 总结:
    • 通过 addWidget()方法手动添加的QToolButton需自行管理样式。
      • 适合快速创建统一风格的按钮(如标准的 “新建”“保存”),减少重复代码。
    • 不同的是,通过addAction()方法添加 QAction 动作,工具栏会自动创建 QToolButton,并绑定动作,按钮样式由工具栏的toolButtonStyle统一控制。
      • 适合复杂场景(如带下拉菜单的按钮、自定义组合控件),允许完全控制按钮样式。

2. 图标与文本布局

通过 Qt::ToolButtonStyle 控制图标和文本的显示方式。

toolBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 文本在图标下方
// 可选值:IconOnly(仅图标)、TextOnly(仅文本)、TextBesideIcon(文本在图标旁)等

3. 下拉菜单与弹出模式

QToolButton 可关联下拉菜单,支持三种弹出模式:

QMenu *menu = new QMenu(this);
menu->addAction("保存", this, &MainWindow::save);
menu->addAction("另存为", this, &MainWindow::saveAs);

toolBtn->setMenu(menu);
toolBtn->setPopupMode(QToolButton::MenuButtonPopup); // 右侧显示箭头,点击箭头弹出菜单
// 其他模式:InstantPopup(点击立即弹菜单)、DelayedPopup(长按弹菜单,默认)

4. 可切换状态(类似复选框)

设置为“可检查”模式后,按钮可保持“按下/释放”状态。

toolBtn->setCheckable(true); // 启用可检查状态
connect(toolBtn, &QToolButton::toggled, this, &MainWindow::toggleTool); // 连接切换信号

5. 自动提升与箭头样式

  • 自动提升:鼠标悬停时按钮呈现 3D 凸起效果。
  • 箭头样式:可显示箭头(替代图标)。
toolBtn->setAutoRaise(true);  // 启用自动提升(无边框,悬停时凸起)
toolBtn->setArrowType(Qt::DownArrow); // 显示下箭头(替代图标)

6. 设置提示

toolBtn->setToolTip(tr("这是系统设置按钮"));

鼠标停留在工具按钮上方,会有如下效果:
在这里插入图片描述

三、结合使用示例

QToolButtonQToolBar 配合,实现带下拉菜单的保存按钮:

QMainWindow window;
QToolBar *toolBar = new QToolBar(&window);
window.addToolBar(toolBar);

QToolButton *saveBtn = new QToolButton(&window);
saveBtn->setIcon(QIcon(":/save.png"));
saveBtn->setText("保存");
saveBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

QMenu *saveMenu = new QMenu(&window);
saveMenu->addAction("保存", &window, []() { qDebug() << "保存文件"; });
saveMenu->addAction("另存为", &window, []() { qDebug() << "另存为..."; });

saveBtn->setMenu(saveMenu);
saveBtn->setPopupMode(QToolButton::MenuButtonPopup);

toolBar->addWidget(saveBtn);
window.show();

四、总结

  • QToolBar:负责工具栏的整体容器管理,支持停靠、浮动、布局定制,通过 addAction()/addWidget() 填充内容。
  • QToolButton:专注于工具栏内的按钮交互,支持图标、文本、下拉菜单、可切换状态等特性,是构建复杂工具栏的核心组件。

两者结合可实现灵活、专业的工具栏界面,提升用户操作效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

油炸自行车

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

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

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

打赏作者

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

抵扣说明:

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

余额充值