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);
}
相关推荐
似水明俊德5 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
Thera7775 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
炘爚6 小时前
C语言(文件操作)
c语言·开发语言
阿蒙Amon6 小时前
C#常用类库-详解SerialPort
开发语言·c#
凸头7 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言
wuqingshun3141597 小时前
线程安全需要保证几个基本特征
java·开发语言·jvm
Moksha2627 小时前
5G、VoNR基本概念
开发语言·5g·php
jzlhll1237 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin
W.D.小糊涂7 小时前
gpu服务器安装windows+ubuntu24.04双系统
c语言·开发语言·数据库
用头发抵命7 小时前
Vue 3 中优雅地集成 Video.js 播放器:从组件封装到功能定制
开发语言·javascript·ecmascript