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

二、全屏相關(guān)函數(shù)
1,全屏顯示函數(shù)
QWidget::showFullScreen(); // 此方法只對(duì)頂級(jí)窗口有效,對(duì)子窗口無(wú)效
2,恢復(fù)顯示函數(shù)
QWidget::showNormal(); // 此方法也只對(duì)頂級(jí)窗口有效,對(duì)子窗口無(wú)效
3,最小化顯示函數(shù)
QWidget::showMinimized();
4,最大化顯示函數(shù)
QWidget::showMaximized();
5,設(shè)置窗口類(lèi)型
QWidget::setWindowFlags(Qt::WindowFlags);
三,子窗口全屏顯示兩種實(shí)現(xiàn)方式
ps: 本文只測(cè)試了Qt 6環(huán)境運(yùn)行情況。
Qt中的窗口QWidget成員函數(shù)showFullScreen,可以將窗口全屏顯示,但是只是對(duì)窗口模式有用, 也就是具有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. 方式一: 直接將主窗口全屏,只顯示某個(gè)子窗口
這是一種實(shí)現(xiàn)起來(lái)可能比較繁瑣的方式,因?yàn)橐[藏所有不想看到的控件,退出全屏還得恢復(fù)原樣,控制粒度比較精細(xì)。
但是這種實(shí)現(xiàn)方式,不會(huì)有多屏顯示器的問(wèn)題,會(huì)直接全屏顯示到當(dāng)前窗口屏幕。
先建立一個(gè)工程如下

由于要隱藏控件,使用QWidget做布局控件,不要使用Vertical Layout或者Horizontal Layout,它們沒(méi)有hide()函數(shù)。
點(diǎn)擊按鈕實(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();
}
}
在全屏的方式下,不需要的控件需要隱藏,所以最好有一個(gè)QWidget來(lái)包含這些要隱藏的控件,就只需要隱藏這個(gè)QWidget本身。
當(dāng)退出全屏?xí)r候需要恢復(fù)顯示。
ESC按鍵退出全屏
在主窗口中進(jìn)行鍵盤(pán)按鍵過(guò)濾可以直接實(shí)現(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();
}
}
上述代碼會(huì)在鍵盤(pán)按鍵按下那一瞬間執(zhí)行,如果匹配Qt::Key_Escape就退出全屏。
2. 方式二:子窗口設(shè)置Qt::Window標(biāo)志,全屏顯示
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;
}
注意到這里有個(gè)installEventFilter,因?yàn)樽哟翱谌亮?,MainWindow不是激活的,他沒(méi)法捕捉到鍵盤(pán)事件,這里只能重新指定事件過(guò)濾器。
當(dāng)全屏的時(shí)候安裝子窗口事件過(guò)濾器,退出全屏?xí)r候移除。
響應(yīng)按鈕事件
void MainWindow::on_pushButtonChildFullScreen_clicked() {
if (!fsWidget_) {
qDebug() << "enable full screen";
enableChildFullScreen();
} else {
qDebug() << "disable full screen";
disableChildFullScreen();
}
}
事件過(guò)濾器
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; // 事件已處理,不傳遞給其他對(duì)象
}
}
return QMainWindow::eventFilter(watched, event); // 將事件傳遞給基類(lèi)處理
}
多顯示器問(wèn)題
這種方式如果遇到多顯示器會(huì)有問(wèn)題,子窗口全屏后只會(huì)顯示在主顯示器。同時(shí)原來(lái)的窗口框架依然在,會(huì)顯示如下一個(gè)缺少那個(gè)子窗口的樣子。

如果只有一個(gè)顯示器,這個(gè)問(wèn)題也就不用解決了。
另一個(gè)就是hide主窗口,子窗口依然會(huì)全屏,但是hide了之后任務(wù)欄是看不見(jiàn)的。
再或者解決方法就是移動(dòng)子窗口到主窗口顯示器……
四、源碼
https://gitee.com/noevilme/QtDemo/tree/master/FullScreen
到此這篇關(guān)于Qt6子窗口全屏顯示的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Qt6子窗口全屏顯示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt實(shí)現(xiàn)繪制多個(gè)設(shè)備的流量曲線圖詳解
這篇文章主要為大家詳細(xì)介紹了如何使用Qt開(kāi)發(fā)繪制多個(gè)設(shè)備的流量曲線圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下2023-01-01
全局變量與局部變量在內(nèi)存中的區(qū)別詳細(xì)解析
以下是對(duì)全局變量與局部變量在內(nèi)存中的區(qū)別進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
C++分布式語(yǔ)音識(shí)別服務(wù)實(shí)踐方案
最近基于C++實(shí)現(xiàn)了一個(gè)分布式語(yǔ)音識(shí)別子服務(wù),核心目標(biāo)是提供高可用的 RPC 接口,支持客戶端上傳 PCM 音頻文件并返回識(shí)別結(jié)果,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-10-10
C語(yǔ)言數(shù)據(jù)類(lèi)型轉(zhuǎn)換實(shí)例代碼

