欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt6子窗口全屏顯示的實現(xiàn)示例

 更新時間:2024年04月17日 14:46:35   作者:noevil  
在Qt開發(fā)中,有時候需要讓程序窗口全屏顯示,本文主要介紹了Qt6子窗口全屏顯示的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、全屏顯示效果

在這里插入圖片描述

二、全屏相關函數(shù)

1,全屏顯示函數(shù)

QWidget::showFullScreen(); // 此方法只對頂級窗口有效,對子窗口無效

2,恢復顯示函數(shù)

QWidget::showNormal(); // 此方法也只對頂級窗口有效,對子窗口無效

3,最小化顯示函數(shù)

QWidget::showMinimized();

4,最大化顯示函數(shù)

QWidget::showMaximized();

5,設置窗口類型

QWidget::setWindowFlags(Qt::WindowFlags);

三,子窗口全屏顯示兩種實現(xiàn)方式

ps: 本文只測試了Qt 6環(huán)境運行情況。

Qt中的窗口QWidget成員函數(shù)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. 方式一: 直接將主窗口全屏,只顯示某個子窗口

這是一種實現(xiàn)起來可能比較繁瑣的方式,因為要隱藏所有不想看到的控件,退出全屏還得恢復原樣,控制粒度比較精細。

但是這種實現(xiàn)方式,不會有多屏顯示器的問題,會直接全屏顯示到當前窗口屏幕。

先建立一個工程如下

在這里插入圖片描述

由于要隱藏控件,使用QWidget做布局控件,不要使用Vertical Layout或者Horizontal Layout,它們沒有hide()函數(shù)。

點擊按鈕實現(xiàn)全屏或者退出全屏

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按鍵退出全屏

在主窗口中進行鍵盤按鍵過濾可以直接實現(xiàn)keyPressEvent虛函數(shù)即可。

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

上述代碼會在鍵盤按鍵按下那一瞬間執(zhí)行,如果匹配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子窗口全屏顯示的實現(xiàn)示例的文章就介紹到這了,更多相關Qt6子窗口全屏顯示內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • C++ float轉std::string 小數(shù)位數(shù)控制問題

    C++ float轉std::string 小數(shù)位數(shù)控制問題

    這篇文章主要介紹了C++ float轉std::string 小數(shù)位數(shù)控制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++實現(xiàn)LeetCode(53.最大子數(shù)組)

    C++實現(xiàn)LeetCode(53.最大子數(shù)組)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(53.最大子數(shù)組),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 深度解析C語言中數(shù)據(jù)的存儲

    深度解析C語言中數(shù)據(jù)的存儲

    本文詳細介紹了C語言中數(shù)據(jù)的存儲,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C++實現(xiàn)拷貝構造函數(shù)的方法詳解

    C++實現(xiàn)拷貝構造函數(shù)的方法詳解

    拷貝構造函數(shù)是構造函數(shù)的一個重載,因此顯式的定義了拷貝構造,那么編譯器也不再默認生成構造函數(shù)。本文主要介紹了C++實現(xiàn)拷貝構造函數(shù)的方法,需要的可以參考一下
    2022-09-09
  • C++精要分析lambda表達式的使用

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

    Lambda表達式是現(xiàn)代C++在C ++ 11和更高版本中的一個新的語法糖 ,在C++11、C++14、C++17和C++20中Lambda表達的內容還在不斷更新。 lambda表達式(也稱為lambda函數(shù))是在調用或作為函數(shù)參數(shù)傳遞的位置處定義匿名函數(shù)對象的便捷方法
    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++的內存分配方式以及介紹了下棧和堆的區(qū)別,感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • C++ Boost命令行解析庫的應用詳解

    C++ Boost命令行解析庫的應用詳解

    命令行解析庫是一種用于簡化處理命令行參數(shù)的工具,它可以幫助開發(fā)者更方便地解析命令行參數(shù)并提供適當?shù)膸椭畔?本文主要介紹了不同的命令行解析庫和它們在C++項目中的應用,希望對大家有所幫助
    2023-11-11
  • C語言實現(xiàn)無頭單鏈表詳解

    C語言實現(xiàn)無頭單鏈表詳解

    大家好,本篇文章主要講的是C語言實現(xiàn)無頭單鏈表詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02

最新評論