遇到一个奇葩需求,要求界面隐藏标题栏和任务栏全屏显示,但是又想在界面的右上角显示一个关闭按钮,关键是如何把工具栏上的按钮放在最右边,关键是我这还是要两个工具栏,一个常驻,一个需要根据状态隐藏和显示,这个关闭按钮还要在两个任务栏上跳舞,就比较蛋疼了,最终效果如下图所示

实现代码如下,直接在mainwindow构造函数中调用一下就行
cpp
void MainWindow::initToolBar()
{
// 1. 创建关闭按钮
m_closeBtn = new QPushButton(this);
m_closeBtn->setFixedSize(ui->toolBar->iconSize());
m_closeBtn->setIcon(QIcon(":/icons/exit.png"));
m_closeBtn->setIconSize(ui->toolBar->iconSize());
connect(m_closeBtn, &QPushButton::clicked, this, &MainWindow::close);
// 2. 给常驻工具栏添加右对齐容器【关键:加到工具栏最后,不改动工具栏整体边距】
QWidget* container1 = new QWidget;
QHBoxLayout* layout1 = new QHBoxLayout(container1);
// 仅清空容器内部的边距(不影响工具栏整体)
layout1->setContentsMargins(0, 0, 5, 0); // 右侧留5px避免贴太紧,可改0
layout1->setSpacing(0);
// 间隔项:推按钮到右侧(仅容器内生效,不影响工具栏其他按钮)
layout1->addSpacerItem(new QSpacerItem(0,0,QSizePolicy::Expanding, QSizePolicy::Minimum));
layout1->addWidget(m_closeBtn); // 先临时加这里,后续动态切换
// 核心:将容器添加到工具栏【最后一位】,保证原有按钮全保留
ui->toolBar->addWidget(container1);
// 3. 给可隐藏工具栏(hidableBar)添加右对齐容器(逻辑同上)
QWidget* container2 = new QWidget;
QHBoxLayout* layout2 = new QHBoxLayout(container2);
layout2->setContentsMargins(0, 0, 5, 0);
layout2->setSpacing(0);
layout2->addSpacerItem(new QSpacerItem(0,0,QSizePolicy::Expanding, QSizePolicy::Minimum));
// 初始不添加按钮,仅创建容器
ui->toolBar_edit->addWidget(container2);
// 4. 按钮切换逻辑(修正:先移除再添加,避免重复)
auto moveCloseButton = [=](bool isHidableBarVisible) {
// 先从当前布局移除按钮(避免重复显示)
m_closeBtn->setParent(nullptr);
// 切换到目标容器
if (isHidableBarVisible) {
layout2->addWidget(m_closeBtn);
} else {
layout1->addWidget(m_closeBtn);
}
};
// 初始位置:根据可隐藏工具栏状态适配
moveCloseButton(ui->toolBar_edit->isVisible());
// 监听状态变化
connect(ui->toolBar_edit, &QToolBar::visibilityChanged, moveCloseButton);
}