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

相关推荐
遇印记7 小时前
传输层,网络层
运维·服务器·网络·windows·学习
死磕音视频8 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
又見山9 小时前
Obsidian 跨平台同步实测:Nutstore Sync 在 Windows、Mac、Linux、iOS、Android 全平台综合测评
windows·macos·obsidian·obsidian同步·obsidian教程·obsidian入门·obsidian笔记库搭建
顽疲10 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
jearry10 小时前
一个编辑器两个内核:Markdown 实时视图与源码视图并存时的竞态、光标锚点与 PDF 导出
windows·markdown
用户83344239661410 小时前
从批量操作到任务中心,再到现场工作台:DeviceForge v2.10—v2.12 完整演进
qt
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
逆向编程10 小时前
DirectX修复工具下载安装教程-Windows系统DLL缺失检测修复完整图文步骤
windows
钱栈up11 小时前
电脑卡死7分钟,日志断在13:56:03:一次Windows硬挂死的根因复盘
windows
宛 禾12 小时前
Qt 控件入门:QLabel 从拖拽到对象树,一篇讲透
c++·qt·学习