Qt全屏显示,在顶部工具栏的最右边显示关闭按钮

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

实现代码如下,直接在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);
}
相关推荐
我就是妖怪9 分钟前
Kimi K2.6 智能效果实测与能力全景展示
开发语言
中二痞12 分钟前
下载Python 版本,环境变量变更以及PyCharm更换python版本
开发语言·python·pycharm
故事和你9115 分钟前
洛谷-算法2-3-分治与倍增5
开发语言·数据结构·c++·算法·动态规划·图论
SilentSamsara15 分钟前
标准库精讲:collections/itertools/functools/pathlib 实战
开发语言·vscode·python·青少年编程·pycharm
逻辑驱动的ken20 分钟前
Java高频面试考点场景题17
开发语言·jvm·面试·求职招聘·春招
charlie11451419121 分钟前
通用GUI编程技术——图形渲染实战(三十九)——纹理与采样器:从WIC加载到GPU渲染
开发语言·c++·图形渲染·win32
love530love26 分钟前
Python 3.12 解决 MediaPipe “no attribute ‘solutions‘” 终极方案:基于全版本硬核实测的避坑指南
开发语言·人工智能·windows·python·comfyui·mediapipe·solutions
爱码小白27 分钟前
Python 类五大方法 完整版学习笔记
开发语言·python
Fuly102431 分钟前
java面试知识点复习
java·开发语言·面试
郭涤生38 分钟前
std::condition_variable的使用及主要事项
开发语言·c++