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);
}
相关推荐
2601_962071576 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
淡海水7 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero8 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-9 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
黑马程序员毕设11 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
_Twink1e11 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
问天_观心11 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
阿里嘎多学长11 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
大丑哥12 小时前
QT QML 中实现高亮功能
qt
源代码•宸12 小时前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang