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

二、全屏相關(guān)函數(shù)
1,全屏顯示函數(shù)
QWidget::showFullScreen(); // 此方法只對頂級窗口有效,對子窗口無效
2,恢復(fù)顯示函數(shù)
QWidget::showNormal(); // 此方法也只對頂級窗口有效,對子窗口無效
3,最小化顯示函數(shù)
QWidget::showMinimized();
4,最大化顯示函數(shù)
QWidget::showMaximized();
5,設(shè)置窗口類型
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)起來可能比較繁瑣的方式,因為要隱藏所有不想看到的控件,退出全屏還得恢復(fù)原樣,控制粒度比較精細。
但是這種實現(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本身。
當退出全屏?xí)r候需要恢復(fù)顯示。
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. 方式二:子窗口設(shè)置Qt::Window標志,全屏顯示
mainwindow.h
需要用到成員變量,保存子窗口和它以前的WindowFlags,退出全屏?xí)r候需要恢復(fù)。
// 子窗口全屏
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不是激活的,他沒法捕捉到鍵盤事件,這里只能重新指定事件過濾器。
當全屏的時候安裝子窗口事件過濾器,退出全屏?xí)r候移除。
響應(yīng)按鈕事件
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了之后任務(wù)欄是看不見的。
再或者解決方法就是移動子窗口到主窗口顯示器……
四、源碼
https://gitee.com/noevilme/QtDemo/tree/master/FullScreen
到此這篇關(guān)于Qt6子窗口全屏顯示的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Qt6子窗口全屏顯示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題
這篇文章主要介紹了C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
C++實現(xiàn)LeetCode(53.最大子數(shù)組)
這篇文章主要介紹了C++實現(xiàn)LeetCode(53.最大子數(shù)組),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
C++實現(xiàn)拷貝構(gòu)造函數(shù)的方法詳解
拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的一個重載,因此顯式的定義了拷貝構(gòu)造,那么編譯器也不再默認生成構(gòu)造函數(shù)。本文主要介紹了C++實現(xiàn)拷貝構(gòu)造函數(shù)的方法,需要的可以參考一下2022-09-09

