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);
}
相关推荐
Risehuxyc4 分钟前
备份三个PHP程序
android·开发语言·php
lly20240610 分钟前
PHP Error: 常见错误及其解决方法
开发语言
网安墨雨11 分钟前
Python自动化一------pytes与allure结合生成测试报告
开发语言·自动化测试·软件测试·python·职场和发展·自动化
毕设源码李师姐13 分钟前
计算机毕设 java 基于 java 的图书馆借阅系统 智能图书馆借阅综合管理平台 基于 Java 的图书借阅与信息管理系统
java·开发语言·课程设计
忆~遂愿13 分钟前
Runtime 上下文管理:计算实例的生命周期、延迟最小化与上下文切换优化
java·大数据·开发语言·人工智能·docker
沐知全栈开发15 分钟前
PostgreSQL中的AND和OR操作符
开发语言
1尢晞119 分钟前
Java学习
java·开发语言
毕设源码-赖学姐28 分钟前
【开题答辩全过程】以 基于python的电影推荐系统为例,包含答辩的问题和答案
开发语言·python
星辰_mya33 分钟前
Elasticsearch线上问题之慢查询
java·开发语言·jvm
前端小菜袅36 分钟前
PC端原样显示移动端页面方案
开发语言·前端·javascript·postcss·px-to-viewport·移动端适配pc端