广告位联系
返回顶部
分享到

Qt6子窗口全屏显示的实现

C语言 来源:互联网 作者:佚名 发布时间:2024-04-17 22:10:31 人浏览
摘要

一、全屏显示效果 二、全屏相关函数 1,全屏显示函数 1 QWidget::showFullScreen(); // 此方法只对顶级窗口有效,对子窗口无效 2,恢复显示函数 1 QWidget::showNormal(); // 此方法也只对顶级窗口有效,对子

一、全屏显示效果

在这里插入图片描述

二、全屏相关函数

1,全屏显示函数

1

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

2,恢复显示函数

1

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

3,最小化显示函数

1

QWidget::showMinimized();

4,最大化显示函数

1

QWidget::showMaximized();

5,设置窗口类型

1

QWidget::setWindowFlags(Qt::WindowFlags);

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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()函数。

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

1

2

3

4

5

6

7

8

9

10

11

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虚函数即可。

1

2

3

4

5

6

7

8

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,退出全屏时候需要恢复。

1

2

3

4

5

6

// 子窗口全屏

QWidget *fsWidget_ = nullptr;

Qt::WindowFlags fsFlags_;

 

void enableChildFullScreen();

void disableChildFullScreen();

全屏与退出

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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不是激活的,他没法捕捉到键盘事件,这里只能重新指定事件过滤器。

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

响应按钮事件

1

2

3

4

5

6

7

8

9

void MainWindow::on_pushButtonChildFullScreen_clicked() {

    if (!fsWidget_) {

        qDebug() << "enable full screen";

        enableChildFullScreen();

    } else {

        qDebug() << "disable full screen";

        disableChildFullScreen();

    }

}

事件过滤器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 :
    Tag :
相关文章
  • C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含义说明
    sln,vcxproj,vcxproj.filters,lib,dll,exe含义 建立工程 建立C++工程后会生成多个文件 例如 sln,sdf,vcxproj,vcxproj.filters,vcxproj.user这些都是文件的扩展名。
  • Qt6子窗口全屏显示的实现

    Qt6子窗口全屏显示的实现
    一、全屏显示效果 二、全屏相关函数 1,全屏显示函数 1 QWidget::showFullScreen(); // 此方法只对顶级窗口有效,对子窗口无效 2,恢复显示函数
  • Qt获取git版本信息的具体方法

    Qt获取git版本信息的具体方法
    今天又碰到这个问题了,想根据具体的git版本信息做代码问题确认。之前写过类似的文章,不是用的Makedown,今天规整一下。 2、具体方法
  • C#串行通信serialPort的使用
    System.IO.Ports.SerialPort类是C#中用于串行通信的类。它提供了一组属性和方法,用于配置串行端口、读取和写入数据,以及处理串行通信中的事
  • C++中IO多路复用(select、poll、epoll)的实现介绍

    C++中IO多路复用(select、poll、epoll)的实现介绍
    什么是IO多路复用 I/O多路复用(IO multiplexing)是一种并发处理多个I/O操作的机制。它允许一个进程或线程同时监听多个文件描述符(如套接
  • C++文件IO流及stringstream流读写文件和字符串操作介

    C++文件IO流及stringstream流读写文件和字符串操作介
    一、引入 1 2 3 4 5 6 7 8 9 int main() { string str; while (cin str) { cout str endl; } return 0; } 我们在OJ的时候经常会用到while(cin str),这里的流提取实际上是
  • C++特殊类设计概念与示例介绍

    C++特殊类设计概念与示例介绍
    一、设计模式概念 设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码可重用
  • C++内存对齐的实现方法
    内存对齐的基本原则: 结构(struct/class)的内置类型数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的起始位置要从自身
  • 更优雅的C++字符串格式化实现方法介绍
    在用C++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时,目前大部分sql拼接方式都是通过ostringstream流一点一点拼接
  • C++模拟实现vector

    C++模拟实现vector
    一、迭代器 定义 vector类型的迭代器就是原生态的指针,对T*进行重命名即可 1 2 typedef T* iterator; typedef const T* const_iterator; 普通迭代器 1 2 3
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计