目录
二、覆盖Windows任务栏的推荐写法(先show再setGeometry)
[最稳方案:无边框 + 原生屏幕 geometry](#最稳方案:无边框 + 原生屏幕 geometry)
[Qt Widgets(最常用)](#Qt Widgets(最常用))
[一行版(简单窗口 / QWidget)](#一行版(简单窗口 / QWidget))
[三、Qt 6 / QWindow](#三、Qt 6 / QWindow)
[四、真·Kiosk / 工控模式(Windows 下最强)](#四、真·Kiosk / 工控模式(Windows 下最强))
[Windows + Qt Widgets(100% 盖任务栏)](#Windows + Qt Widgets(100% 盖任务栏))
[五、showFullScreen() 为什么"不一定"盖任务栏?](#五、showFullScreen() 为什么“不一定”盖任务栏?)
[1.用 availableGeometry](#1.用 availableGeometry)
[2.show() 前 setGeometry(Windows)](#2.show() 前 setGeometry(Windows))
觉得有用,就请您帮忙点赞转发收藏吧,您的鼓励是我创作的动力,多谢看官。
由于能力水平有限,文中的错误或不严谨的地方在所难免,还请批评指正。
在 Qt 里,"全屏"和"真·全屏"是两回事。
showFullScreen()只是向窗口管理器请求一个全屏状态,在 Windows 下通常能盖住任务栏,但在 GNOME / Wayland / 多屏环境下往往会被系统拦住。真正覆盖任务栏、Dock、面板(Panel)的做法只有一种思路:绕过窗口装饰协议,用无边框窗口直接占据屏幕原生分辨率。
本文总结 Qt Widgets / QWindow 下稳定可用的"真全屏"写法,以及
geometry / availableGeometry / showFullScreen背后的平台差异坑。
一、目标定义先说清
"全屏并覆盖任务栏" ≠ showFullScreen() 的默认行为
| 方式 | 是否盖任务栏 |
|---|---|
showFullScreen() |
不一定(Windows 会盖,部分桌面 / Wayland 不盖) |
showMaximized() |
不盖 |
setGeometry(screen->geometry()) |
有时被 WM 限制 |
| 无边框 + native geometry | 稳盖 |
二、覆盖Windows任务栏的推荐写法(先show再setGeometry)
最稳方案:无边框 + 原生屏幕 geometry
Qt Widgets(最常用)
#include <QScreen>
#include <QGuiApplication>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent, Qt::Window | Qt::FramelessWindowHint)
{
setAttribute(Qt::WA_NativeWindow);
}
void MainWindow::showEvent(QShowEvent *event)
{
QMainWindow::showEvent(event);
auto screen = QGuiApplication::primaryScreen();
if (screen)
setGeometry(screen->geometry());
}
关键点
-
Qt::FramelessWindowHint(让 WM 允许盖任务栏) -
用
screen->geometry()(不是availableGeometry()) -
showEvent 里设 geometry (show 前设会被 WM 覆盖)
软件运行截图


一行版(简单窗口 / QWidget)
setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
show();
setGeometry(QGuiApplication::primaryScreen()->geometry());
三、Qt 6 / QWindow
window->setFlags(Qt::FramelessWindowHint);
window->show();
window->setGeometry(QGuiApplication::primaryScreen()->geometry());
四、真·Kiosk / 工控模式(Windows 下最强)
Windows + Qt Widgets(100% 盖任务栏)
setWindowFlags(
Qt::Window |
Qt::FramelessWindowHint |
Qt::WindowStaysOnTopHint
);
show();
setGeometry(QGuiApplication::primaryScreen()->geometry());
加 WindowStaysOnTopHint:
-
任务栏点不了
-
Win + D 也弹不走(合规风险注意)
五、showFullScreen() 为什么"不一定"盖任务栏?
showFullScreen();
内部其实是:
setWindowState(Qt::WindowFullScreen);
平台差异表
| 平台 | 行为 |
|---|---|
| Windows | ✅ 盖任务栏 |
| macOS | ✅ 盖 Dock / menu bar |
| X11 / KDE | ✅ |
| Wayland | 由 compositor 决定(很多不盖) |
| GNOME Shell | 只给你"最大化 workspace" |
Wayland / Linux 桌面:Qt 说了不算
六、多屏:盖指定屏幕(不是主屏)
auto screens = QGuiApplication::screens();
if (screens.size() > 1) {
auto target = screens[1];
setGeometry(target->geometry());
}
多屏 + Windows:
-
一定要用
screen->geometry() -
不要
virtualDesktop()自己算(Qt 会帮你拼)
七、常见错误
1.用 availableGeometry
setGeometry(screen->availableGeometry()); // 永远留任务栏
2.show() 前 setGeometry(Windows)
setGeometry(...);
show(); // WM 会修正你
正确顺序:
show();
setGeometry(...);
或重写 showEvent()
八、终极推荐模板
void initFullscreenKiosk(QWidget *w)
{
w->setWindowFlags(
Qt::Window |
Qt::FramelessWindowHint |
Qt::WindowStaysOnTopHint
);
w->show();
auto screen = QGuiApplication::primaryScreen();
if (screen)
w->setGeometry(screen->geometry());
}
九、一句话总结
Qt 想"全屏不盖任务栏"用
showMaximized();想"全屏并覆盖任务栏"用
FramelessWindowHint + setGeometry(screen->geometry());
showFullScreen()是请求,无边框 geometry 是命令。