Qt 6子窗口全屏显示

一、全屏显示效果

在这里插入图片描述

二、全屏相关函数

1,全屏显示函数

QWidget::showFullScreen(); // 此方法只对顶级窗口有效,对子窗口无效

2,恢复显示函数

QWidget::showNormal(); // 此方法也只对顶级窗口有效,对子窗口无效

3,最小化显示函数

QWidget::showMinimized();

4,最大化显示函数

QWidget::showMaximized();

5,设置窗口类型

QWidget::setWindowFlags(Qt::WindowFlags);

三,子窗口全屏显示两种实现方式

ps: 本文只测试了Qt 6环境运行情况。

Qt中的窗口QWidget成员函数showFullScreen,可以将窗口全屏显示,但是只是对窗口模式有用, 也就是具有Qt::Window属性的窗口。

    enum WindowType {
        Widget = 0x00000000,
        Window = 0x00000001,
        Dialog = 0x00000002 | Window,
        Sheet = 0x00000004 | Window,
        Drawer = Sheet | Dialog,
        Popup = 0x00000008 | Window,
        Tool = Popup | Dialog,
        ToolTip = Popup | Sheet,
        SplashScreen = ToolTip | Dialog,
        Desktop = 0x00000010 | Window,
        SubWindow = 0x00000012,
        ForeignWindow = 0x00000020 | Window,
        CoverWindow = 0x00000040 | Window,
        ...
    };

Dialog也具有Qt::Window属性。

1. 方式一: 直接将主窗口全屏,只显示某个子窗口

这是一种实现起来可能比较繁琐的方式,因为要隐藏所有不想看到的控件,退出全屏还得恢复原样,控制粒度比较精细。

但是这种实现方式,不会有多屏显示器的问题,会直接全屏显示到当前窗口屏幕。

先建立一个工程如下

在这里插入图片描述

由于要隐藏控件,使用QWidget做布局控件,不要使用Vertical Layout或者Horizontal Layout,它们没有hide()函数。

点击按钮实现全屏或者退出全屏

void MainWindow::on_pushButtonHideFullScreen_clicked() {
    if (this->isFullScreen()) {
        this->showNormal();
        ui->widgetControl->show();
        ui->statusbar->show();
    } else {
        this->showFullScreen();
        ui->widgetControl->hide();
        ui->statusbar->hide();
    }
}

在全屏的方式下,不需要的控件需要隐藏,所以最好有一个QWidget来包含这些要隐藏的控件,就只需要隐藏这个QWidget本身。

当退出全屏时候需要恢复显示。

ESC按键退出全屏

在主窗口中进行键盘按键过滤可以直接实现keyPressEvent虚函数即可。

void MainWindow::keyPressEvent(QKeyEvent *event) {
    if (this->isFullScreen() && event->key() == Qt::Key_Escape) {
        qDebug() << "ESC";
        this->showNormal();
        ui->widgetControl->show();
        ui->statusbar->show();
    }
}

上述代码会在键盘按键按下那一瞬间执行,如果匹配Qt::Key_Escape就退出全屏。

2. 方式二:子窗口设置Qt::Window标志,全屏显示

mainwindow.h

需要用到成员变量,保存子窗口和它以前的WindowFlags,退出全屏时候需要恢复。

    // 子窗口全屏
    QWidget *fsWidget_ = nullptr;
    Qt::WindowFlags fsFlags_;

    void enableChildFullScreen();
    void disableChildFullScreen();

全屏与退出

void MainWindow::enableChildFullScreen() {
    fsWidget_ = ui->openGLWidget;
    fsFlags_ = fsWidget_->windowFlags();

    fsWidget_->setWindowFlags(Qt::Window | Qt::WindowStaysOnTopHint |
                              Qt::FramelessWindowHint);
    fsWidget_->setFocus();
    fsWidget_->showFullScreen();
    fsWidget_->installEventFilter(this);
}

void MainWindow::disableChildFullScreen() {
    fsWidget_->setWindowFlags(fsFlags_);
    fsWidget_->showNormal();
    fsWidget_->removeEventFilter(this);
    fsWidget_ = nullptr;
}

注意到这里有个installEventFilter,因为子窗口全屏了,MainWindow不是激活的,他没法捕捉到键盘事件,这里只能重新指定事件过滤器。

当全屏的时候安装子窗口事件过滤器,退出全屏时候移除。

响应按钮事件


void MainWindow::on_pushButtonChildFullScreen_clicked() {
    if (!fsWidget_) {
        qDebug() << "enable full screen";
        enableChildFullScreen();
    } else {
        qDebug() << "disable full screen";
        disableChildFullScreen();
    }
}

事件过滤器


bool MainWindow::eventFilter(QObject *watched, QEvent *event) {
    if (fsWidget_ != nullptr && watched == fsWidget_ &&
        event->type() == QEvent::KeyPress) {
        qDebug() << "ESC";
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        if (keyEvent->key() == Qt::Key_Escape) {
            disableChildFullScreen();

            return true; // 事件已处理,不传递给其他对象
        }
    }

    return QMainWindow::eventFilter(watched, event); // 将事件传递给基类处理
}

多显示器问题

这种方式如果遇到多显示器会有问题,子窗口全屏后只会显示在主显示器。同时原来的窗口框架依然在,会显示如下一个缺少那个子窗口的样子。
在这里插入图片描述
如果只有一个显示器,这个问题也就不用解决了。
另一个就是hide主窗口,子窗口依然会全屏,但是hide了之后任务栏是看不见的。
再或者解决方法就是移动子窗口到主窗口显示器……

四、源码

https://gitee.com/noevilme/QtDemo/tree/master/FullScreen

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/552838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Flask和Flask-JWT-Extended保护API免受跨站请求攻击

在本文中&#xff0c;我们将探讨如何使用Flask和Flask-JWT-Extended库来保护您的API免受跨站请求攻击&#xff08;CSRF&#xff09;。我们将首先简要介绍CSRF攻击的概念&#xff0c;然后详细说明如何使用Flask-JWT-Extended库来保护您的API。 什么是跨站请求攻击&#xff08;C…

【C++题解】1565. 成绩(score)

问题&#xff1a;1565. 成绩&#xff08;score&#xff09; 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 牛牛最近学习了 C 入门课程&#xff0c;这门课程的总成绩计算方法是&#xff1a; 总成绩作业成绩 20% 小测成绩 30% 期末考试成绩 50%。 牛牛想知道&am…

聊聊应用商城评分4.9的Apipost IDEA插件

Apipost Helper&#xff0c;作为IDEA插件&#xff0c;可以快速生成和查询API文档&#xff0c;直观友好地在IDE中调试接口。它简化了开发流程并提升效率&#xff0c;即使新手也能够迅速掌握。Apipost Helper提供了诸多便捷功能&#xff0c;如通过代码查找接口或者通过接口查找代…

C++教你如何模拟实现string,如何实现string写时拷贝

文章目录 前言成员变量默认成员函数默认构造函数拷贝构造函数析构函数赋值运算符重载 容量相关函数&#xff08;Capacity&#xff09;reserve函数resize函数size函数capacity 函数clear函数 修改函数&#xff08;Modifiers&#xff09;swap函数insert函数字符插入字符串插入 ap…

论文阅读-Federated-Unlearning-With-Momentum-Degradation

论文阅读-Federated Unlearning With Momentum Degradation 联邦忘却与动量退化 Yian Zhao IEEE Internet of Things Journal 2023 年 10 月 2 日 CCF-C momentum degradation-MoDe 动量退化 memory guidance-记忆引导 knowledge erasure-知识擦除 Deep-learning neural n…

【笔记】vscode debug进入site-packages包源码

选择左侧栏第三个图标&#xff0c;点击创建 launch.json 文件 选择 Python Debugger 选择Python文件 这里可以看到launch.json 文件 在configurations中添加键值对 "justMyCode": false在文件中打上断点&#xff0c;点击"三角符"号开始调试 按F11或者红框…

ROS 2边学边练(27)-- 创建一个launch文件

前言 ROS 2中的启动系统负责帮助用户描述其系统的配置&#xff0c;然后按描述执行。系统的配置包括运行什么程序&#xff0c;在哪里运行&#xff0c;传递什么参数&#xff0c;以及ROS特定的约定&#xff0c;这些约定通过为每个组件提供不同的配置&#xff0c;使其易于在整个系统…

[stm32]DMA使用

自动重装和M2M(软件trig)不能一起使用&#xff0c;否则会停不下来 void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size){RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddrAddrA;//外…

go语言并发实战——日志收集系统(三) 利用sarama包连接KafKa实现消息的生产与消费

环境的搭建 Kafka以及相关组件的下载 我们要实现今天的内容&#xff0c;不可避免的要进行对开发环境的配置&#xff0c;Kafka环境的配置比较繁琐&#xff0c;需要配置JDK,Scala,ZoopKeeper和Kafka&#xff0c;这里我们不做赘述&#xff0c;如果大家不知道如何配置环境&#x…

STM32芯片flash被锁导致Error Flash Download failed Cortex-M4,解决办法(全)亲测有效

STM32芯片flash被锁导致Error: Flash Download failed - "Cortex-M4"&#xff0c;解决办法&#xff08;全&#xff09;亲测有效&#x1f929;&#xff01; 方法1&#xff1a;由于Keil 中debug的仿真器配置出错导致的下载失败&#xff08;这种问题虽然是低级错误&…

友思特应用 | 红外视角的延伸:短波红外相机的机器视觉应用

导读 短波红外SWIR在不同波段针对不同材料的独特成像特征为各领域检测应用的拓宽提供了基础。本文将展现短波红外成像技术在水分检测、塑料检测、太阳能电池板检查和矿场开采等领域的丰富应用案例&#xff0c;讨论短波红外相机在未来的发展方向。 SWIR 背景简介 短波红外 &am…

基于SpringBoot+Vue的IT技术交流平台(源码+文档+包运行)

一.系统概述 我国科学技术的不断发展&#xff0c;计算机的应用日渐成熟&#xff0c;其强大的功能给人们留下深刻的印象&#xff0c;它已经应用到了人类社会的各个层次的领域&#xff0c;发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分&#xff0c;使用计算机进行…

PHP货运搬家/拉货小程序二开源码搭建的功能

运搬家/拉货小程序的二次开发可以添加许多功能&#xff0c;以增强用户体验和提高业务效率。以下是一些可能的功能&#xff1a; 用户端功能&#xff1a; 注册登录&#xff1a;允许用户创建个人账户并登录以使用应用程序。货物发布&#xff1a;允许用户发布他们需要搬运的货物信息…

OpenHarmony实战开发-如何通过分割swiper区域,实现指示器导航点位于swiper下方的效果。

介绍 本示例介绍通过分割swiper区域&#xff0c;实现指示器导航点位于swiper下方的效果。 效果预览图 使用说明 1.加载完成后swiper指示器导航点&#xff0c;位于显示内容下方。 实现思路 1.将swiper区域分割为两块区域&#xff0c;上方为内容区域&#xff0c;下方为空白区…

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程 &#x1f4cd;相关篇《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》&#x1f388;《STM32 软件I2C方式读取MT6701磁编码器获取角度例程》&#x1f4cc;MT6701当前最新文档资料&#xff1a;https://www.magntek.com.cn/u…

生产服务器变卡怎么排查

服务器变卡怎么排查&#xff0c;可以从以下四个方面去考虑 生产服务器变卡怎么排查 1、网络2、cpu的利用率3、io效率4、内存瓶颈 1、网络 可以使用netstat、iftop等工具查看网络流量和网络连接情况&#xff0c;检查是否网络堵塞、丢包等问题 2、cpu的利用率 1、用top命令定…

VMWare Ubuntu压缩虚拟磁盘

VMWare中ubuntu会越用越大&#xff0c;直到占满预分配的空间 即使系统里没有那么多东西 命令清理 开机->open Terminal sudo vmware-toolbox-cmd disk shrink /关机-> 编辑虚拟机设置->硬盘->碎片整理&压缩 磁盘应用 开机->disk usage analyzer(应用) …

【LLM】认识LLM

文章目录 1.LLM1.1 LLM简介1.2 LLM发展1.3 市面常见的LLM1.4 LLM涌现的能力 2.RAG2.1 RAG简介2.2 RAG 的工作流程2.3 RAG 和 Finetune 对比2.4 RAG的使用场景分析 3. LangChain3.1 LangChain简介3.2 LangChain的核心组件3.3 LangChain 入门 4.开发 RAG 应用的整体流程5. 环境配…

stm32中的中断优先级

在工作中使用到多个定时器中断,由于中断的中断优先级不熟悉导致出错,下面来写一下中断的一些注意事项。 一、中断的分类 1、EXTI外部中断:由外部设备或外部信号引发,例如按键按下、外部传感器信号变化等。外部中断用于响应外部事件,并及时处理相关任务。 2、内部中断:…

搭建Zookeeper完全分布式集群(CentOS 9 )

ZooKeeper是一个开源的分布式协调服务&#xff0c;它为分布式应用提供了高效且可靠的分布式协调服务&#xff0c;并且是分布式应用保证数据一致性的解决方案。该项目由雅虎公司创建&#xff0c;是Google Chubby的开源实现。 分布式应用可以基于ZooKeeper实现诸如数据发布/订阅…