Qt中实现窗口真全屏(覆盖Windows任务栏)

目录

一、目标定义先说清

二、覆盖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 是命令。

相关推荐
霸道流氓气质1 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
路溪非溪2 小时前
Python语言的执行流程总结
开发语言·python
民乐团扒谱机2 小时前
【超详解】量子克拉美罗下界QCRB:时延估计精度极限推导+MATLAB多场景绘图实战
开发语言·机器学习·matlab·量子力学·qcrb
乐观勇敢坚强的老彭3 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
经典19923 小时前
解析pdf表格内容
windows·pdf
离陌在学C#3 小时前
C# 泛型:从基础到高级应用
开发语言·c#
ly76893 小时前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
SomeB1oody3 小时前
【RustyML入门】2.13. 孤立森林
开发语言·后端·机器学习·rust·教程
萧瑟余晖3 小时前
Java深入解析篇三十之Java日志框架
java·开发语言