QxtGlobalShortcut在Qt 6中无法使用,因其是已停止维护的Qt 4第三方库,依赖被移除的私有API、硬编码旧模块且与Qt 6工具链完全不兼容;推荐改用QHotkey替代方案。

QxtGlobalShortcut 为什么在 Qt 6 里根本用不了
因为 QxtGlobalShortcut 是 Qt 4 时代第三方库 Qxt 的组件,早已停止维护,不支持 Qt 5.15+,更别说 Qt 6。你 clone 下来编译报错、qmake 找不到模块、CMake 报 Unknown CMake command "qxt_add_resources"——全是因为它和现代 Qt 工具链彻底脱节。
- Qt 6 彻底移除了
QtWidgets中的私有 API(比如QApplicationPrivate::registerGlobalShortcut),而 Qxt 正是靠这类接口实现的 - Qxt 最后一次提交是 2017 年,其
.pro文件硬编码依赖QT += core gui widgets,与 Qt 6 模块拆分机制冲突 - 即使强行 patch 编译通过,运行时大概率 crash:Windows 上注册失败返回 0 却不报错,macOS 上触发
EXC_BAD_ACCESS
Qt 6 原生替代方案:QHotkey(推荐)
目前最稳定、轻量、跨平台的方案是 QHotkey,它用原生 API 封装(Windows 用 RegisterHotKey,macOS 用 CGEventTapCreate,Linux 用 X11 或 evdev),Qt 6.2+ 完全兼容。
- 安装:用
git submodule add https://www.php.cn/link/fe510a56d595b873d814beaefe60abd9.git src/3rdparty/qhotkey,然后在CMakeLists.txt中add_subdirectory(src/3rdparty/qhotkey)并链接target_link_libraries(your_app PRIVATE QHotkey) - 注册快捷键:
QHotkey hotkey(QKeySequence("Ctrl+Alt+X"), true, this);—— 第二个参数true表示全局生效 - 监听信号:
connect(&hotkey, &QHotkey::activated, this, []{ qDebug() - 注意 macOS 需要开启「辅助功能」权限(系统设置 → 隐私与安全性 → 辅助功能 → 加入你的 App),否则静默失败
Windows 下绕过 QHotkey:直接调用 RegisterHotKey
如果你只做 Windows 版本,且想避开第三方依赖,可以用 Qt 的 nativeEvent 拦截 WM_HOTKEY 消息,手动调用 Win32 API。
- 在主窗口类中重写
nativeEvent(const QByteArray &eventType, void *message, long *result) - 对
eventType == "windows_generic_MSG"且((MSG*)message)->message == WM_HOTKEY做处理 - 注册时调用
RegisterHotKey(HWND, id, MOD_CONTROL | MOD_ALT, 'X'),其中HWND用winId()转换 - 必须在程序退出前调用
UnregisterHotKey,否则快捷键会残留,重启后仍被占用 - 缺点:无法跨窗口响应(比如主窗口最小化后失效),且不能响应 Qt Quick 窗口(
QQuickWindow没有winId())
macOS 注意:NSApplication.sharedApplication().registerForRemoteNotifications() 不相关
别被名字误导——registerForRemoteNotifications 是 iOS/macOS 推送通知用的,和键盘快捷键完全无关。真正要用的是 CGEventTapCreate 或更高层封装如 QHotkey。
- 手动实现需启用「辅助功能」+「输入监控」两项权限,缺一不可
- 调试时若快捷键无反应,先检查
csrutil status是否禁用了 SIP(某些低版本 macOS 要求 SIP 关闭才能监听全局事件) - Qt 6.5+ 的
QGuiApplication::platformName()返回"cocoa"可确认当前运行在 macOS 原生平台,避免误判
跨平台全局快捷键不是“注册一个组合键就完事”,背后是三套完全不同的系统机制。选错方案会在发布前最后一周卡死——比如 macOS 用户反馈快捷键无效,才发现忘了在 Info.plist 里加 NSAppSleepDisabled 和权限声明。











