)
目录一、目标定义先说清二、覆盖Windows任务栏的推荐写法先show再setGeometry最稳方案无边框 原生屏幕 geometryQt Widgets最常用一行版简单窗口 / QWidget三、Qt 6 / QWindow四、真·Kiosk / 工控模式Windows 下最强Windows Qt Widgets100% 盖任务栏五、showFullScreen() 为什么“不一定”盖任务栏平台差异表六、多屏盖指定屏幕不是主屏七、常见错误1.用 availableGeometry2.show() 前 setGeometryWindows八、终极推荐模板九、一句话总结觉得有用就请您帮忙点赞转发收藏吧您的鼓励是我创作的动力多谢看官。由于能力水平有限文中的错误或不严谨的地方在所难免还请批评指正。在 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最稳方案无边框 原生屏幕 geometryQt 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 覆盖软件运行截图一行版简单窗口 / QWidgetsetWindowFlags(Qt::Window | Qt::FramelessWindowHint); show(); setGeometry(QGuiApplication::primaryScreen()-geometry());三、Qt 6 / QWindowwindow-setFlags(Qt::FramelessWindowHint); window-show(); window-setGeometry(QGuiApplication::primaryScreen()-geometry());四、真·Kiosk / 工控模式Windows 下最强Windows Qt Widgets100% 盖任务栏setWindowFlags( Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint ); show(); setGeometry(QGuiApplication::primaryScreen()-geometry());加WindowStaysOnTopHint任务栏点不了Win D 也弹不走合规风险注意五、showFullScreen() 为什么“不一定”盖任务栏showFullScreen();内部其实是setWindowState(Qt::WindowFullScreen);平台差异表平台行为Windows✅ 盖任务栏macOS✅ 盖 Dock / menu barX11 / 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.用 availableGeometrysetGeometry(screen-availableGeometry()); // 永远留任务栏2.show() 前 setGeometryWindowssetGeometry(...); 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 是命令。