Qt6子窗口全屏显示的实现示例

 更新时间:2024年04月17日 14:46:35   作者:noevil  
在Qt开发中,有时候需要让程序窗口全屏显示,本文主要介绍了Qt6子窗口全屏显示的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、全屏显示效果

在这里插入图片描述

二、全屏相关函数

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

到此这篇关于Qt6子窗口全屏显示的实现示例的文章就介绍到这了,更多相关Qt6子窗口全屏显示内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C++ float转std::string 小数位数控制问题

    C++ float转std::string 小数位数控制问题

    这篇文章主要介绍了C++ float转std::string 小数位数控制问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++实现LeetCode(53.最大子数组)

    C++实现LeetCode(53.最大子数组)

    这篇文章主要介绍了C++实现LeetCode(53.最大子数组),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 深度解析C语言中数据的存储

    深度解析C语言中数据的存储

    本文详细介绍了C语言中数据的存储,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C++实现拷贝构造函数的方法详解

    C++实现拷贝构造函数的方法详解

    拷贝构造函数是构造函数的一个重载,因此显式的定义了拷贝构造,那么编译器也不再默认生成构造函数。本文主要介绍了C++实现拷贝构造函数的方法,需要的可以参考一下
    2022-09-09
  • C++精要分析lambda表达式的使用

    C++精要分析lambda表达式的使用

    Lambda表达式是现代C++在C ++ 11和更高版本中的一个新的语法糖 ,在C++11、C++14、C++17和C++20中Lambda表达的内容还在不断更新。 lambda表达式(也称为lambda函数)是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法
    2022-05-05
  • Windows上使用vs编译fdk-aac的教程详解

    Windows上使用vs编译fdk-aac的教程详解

    有时需要在Windows上用到fdk-aac,fdk-aac是源码是cmake的,可以直接转成vs项目,下面就跟随小编一起学习一下如何在Windows上使用vs编译fdk-aac吧
    2023-11-11
  • C/C++中的名字空间与作用域示例详解

    C/C++中的名字空间与作用域示例详解

    这篇文章主要给大家介绍了关于C/C++中名字空间与作用域的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c/c++具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2017-09-09
  • C++内存管理面经

    C++内存管理面经

    这篇文章主要介绍了C++的内存分配方式以及介绍了下栈和堆的区别,感兴趣的小伙伴可以参考阅读本文
    2023-03-03
  • C++ Boost命令行解析库的应用详解

    C++ Boost命令行解析库的应用详解

    命令行解析库是一种用于简化处理命令行参数的工具,它可以帮助开发者更方便地解析命令行参数并提供适当的帮助信息,本文主要介绍了不同的命令行解析库和它们在C++项目中的应用,希望对大家有所帮助
    2023-11-11
  • C语言实现无头单链表详解

    C语言实现无头单链表详解

    大家好,本篇文章主要讲的是C语言实现无头单链表详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02

最新评论