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ù)控制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11C++實現(xiàn)LeetCode(53.最大子數(shù)組)
這篇文章主要介紹了C++實現(xiàn)LeetCode(53.最大子數(shù)組),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07