You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Qt中实现完整屏幕截图?解决示例截图范围受限问题

MacOS下Qt截图仅捕获自身窗口/桌面背景的解决办法

针对你遇到的Qt官方截图示例及Mac原生API都无法正常截取全屏内容(仅能捕获Qt窗口和桌面背景)的问题,以下是经过验证的修复步骤:

1. 重置屏幕录制权限并彻底重启程序

系统权限缓存偶尔会出现“已勾选但未生效”的情况:

  • 打开「系统设置」→「隐私与安全性」→「屏幕录制」
  • 取消勾选你的Qt程序(包括官方示例)
  • 完全退出程序(右键Dock图标选「退出」,或用Activity Monitor结束进程)
  • 重新进入「屏幕录制」设置,再次勾选程序权限
  • 重启程序后尝试截图

2. 确认Qt示例程序的正确操作流程

官方示例默认有两种截图模式,可能你误触发了窗口截图:

  • 点击工具栏的「New Screenshot」(相机图标),程序会自动最小化,此时鼠标变为十字光标,可选择全屏或区域截图
  • 如果直接点击「Take Screenshot」,只会捕获当前Qt主窗口的内容,而非全屏

3. 修正Mac原生API的调用逻辑

如果自行使用原生API,确保没有限制捕获范围,以下是可靠的全屏截图代码片段:

#include <QImage>
#include <ApplicationServices/ApplicationServices.h>

QImage captureFullScreen() {
    // 获取主显示器ID
    CGDisplayID displayID = CGMainDisplayID();
    CGImageRef screenImage = CGDisplayCreateImage(displayID);
    if (!screenImage) return QImage();

    // 转换CGImage到QImage
    QImage qImage(CGImageGetWidth(screenImage), CGImageGetHeight(screenImage), QImage::Format_ARGB32);
    CGContextRef context = QPixmap::fromImage(qImage).toImage().context();
    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(screenImage), CGImageGetHeight(screenImage)), screenImage);

    CGImageRelease(screenImage);
    return qImage;
}

编译时需在Qt项目文件(.pro)中添加框架依赖:

LIBS += -framework ApplicationServices

4. 检查调试环境的权限

如果用Qt Creator调试运行程序,需确保Qt Creator本身也被授予了屏幕录制权限——因为调试时实际的进程是由Qt Creator启动的,权限会继承自父进程。

5. 重置系统隐私权限数据库(极端情况)

若以上方法均无效,可重置系统的隐私权限数据库:

  • 关闭所有程序,打开终端执行:
tccutil reset ScreenCapture
  • 重启电脑后,重新为程序授予屏幕录制权限

内容的提问来源于stack exchange,提问作者Simon R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:42:40