Qt 6子窗口全屏显示

embedded/2024/9/23 10:18:51/

一、全屏显示效果

在这里插入图片描述

二、全屏相关函数

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


http://www.ppmy.cn/embedded/4184.html

相关文章

预付费电表售电系统

1.预付费电表售电系统的定义与功能 预付费电表售电系统是一种现代化的电力管理方式&#xff0c;它改变了传统的后付费模式&#xff0c;用户需预先购买电量&#xff0c;用完后再进行充值。这种系统通过智能电表和后台管理系统相结合&#xff0c;实现了电费的自动计费、实时监控…

100个Go语言典型错误

1 Go:入门容易&#xff0c;掌握难 1.1 Go 大纲 1.2 简单并不意味着容易 1.3 100 个 Go 错误 1.4 本章总结 2 代码和项目组织 2.1 意外的阴影变量 2.2 不必要的嵌套代码 2.3 滥用的 init 函数 2.4 过度使用 getters 和 setters 2.5 接口污染 2.6 在生产者端的接口 2.7 返回接…

python打印字符串与整数时发现的问题

字符串和整数不能用号连在一起&#xff0c;但是用&#xff0c;隔开就不出问题 字符串和整数不能直接使用号连在一起&#xff0c;因为在这里被用作算术运算符进行数值相加。如果尝试这样做&#xff0c;会引发TypeError。但是&#xff0c;如果你使用,将它们隔开&#xff0c;Pytho…

日常小bug

1.mybatis-config.xml中记载sql的映射文件的方式 <mappers><!-- 方法一&#xff1a;使用xml文件进行注册,注意&#xff1a;这里是斜线--><mapper resource"com/dao/UserMapper.xml"/><!-- 方法二&#xff1a;使用class进行注册&#xff0c;注…

【热门话题】探索与心得:深入体验Microsoft Edge浏览器

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 探索与心得&#xff1a;深入体验Microsoft Edge浏览器一、Edge浏览器概述1.1 发…

HBase在大数据集群的安装部署及整合Phoenix

HBase 前提&#xff1a;需要保证三台虚拟机hadoop102-104已经部署好基本配置。未完成的可以参考&#xff1a;https://blog.csdn.net/weixin_73195042/article/details/135886619 安装 上传HBase安装包到/opt/software文件夹内 tar -zxvf hbase-2.4.11-bin.tar.gz -C /opt/m…

电商技术揭秘三十:知识产权保护浅析

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

Spring JdbcTemplate基本使用

1. JdbcTemplate概述 它是spring框架中提供的一个对象&#xff0c;是对原始繁琐的JdbcAPI对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibermateTemplate&#xff0c;操作nosql数据库的RedisTemplate&#xff0c;操作消息队…