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 是命令。

相关推荐
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
rockmelodies3 天前
# Windows Server2008 R2 Standard(SP1镜像U盘)重置本地管理员密码【完整详细步骤】
windows·密码破解
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超3 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
慧都小项3 天前
当边缘AI上产线:QtitanDocking 如何让工业 HMI 实现多视图协同
人工智能·qt·ui·边缘计算·qt6.3
CoderYanger3 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
伞伞悦读3 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json