C++ Qt中new QPixmap(100,100)构造触发0地址读取访问违规,如何获取指定尺寸空绘图区域
报错根因
你遇到的Access violation reading location 0x0000000000000000空指针访问异常,本质是QPixmap依赖的GUI平台层未完成初始化。
QPixmap是对平台原生绘图句柄的封装,内部会绑定当前应用的GUI上下文指针。当该上下文未创建时,内部指针为null,构造过程中读取空指针成员就会直接触发0地址访问违例。
常见触发场景
- 把创建QPixmap的代码写在了QGuiApplication/QApplication实例初始化之前
- 将QPixmap作为全局变量直接构造,全局对象的执行顺序早于main函数内的GUI应用初始化流程
- 多线程场景下在非GUI工作线程直接创建QPixmap:Qt的GUI类有严格的线程亲和性,仅允许在主线程操作
- Qt项目配置缺失GUI相关模块,或者运行目录下未放置对应的平台插件(比如Windows下的
platforms/qwindows.dll) - 在无GUI会话的环境(纯命令行服务、无桌面的SSH会话)下直接调用GUI构造逻辑
正确实现步骤
要获取100x100大小的可绘图空白画布,按顺序完成前置条件后直接构造即可:
- 应用入口最先完成GUI实例初始化,确保平台插件加载完成:
// 基于Widgets的桌面应用用这个 QApplication app(argc, argv); // 纯Qt Quick/无Widgets的GUI应用用这个 // QGuiApplication app(argc, argv); - 等GUI实例初始化完成后,再创建目标QPixmap,可选指定填充色得到不透明的空白画布:
QPixmap* map = new QPixmap(100, 100); // 可选:将默认透明的画布填充为白色,方便后续绘图 map->fill(Qt::white); - 后台线程的图像处理逻辑不要直接用QPixmap,换用无平台依赖的QImage做离屏处理,最后在主线程转成QPixmap即可。
排查清单
如果已经把代码写在QApplication初始化之后还是报错,逐项检查:
- 项目配置文件
.pro中是否添加了对应模块:用Widgets的话需要QT += core gui widgets,纯GUI的话至少要QT += core gui - 可执行文件运行目录下是否存在平台插件文件夹:Windows下需要在exe同层级建
platforms文件夹,放入对应Qt版本的qwindows.dll - 运行环境是否有有效GUI会话:不要在纯无图形界面的终端环境直接运行GUI程序
内容的提问来源于stack exchange,提问作者tvblackman1
相关产品推荐
相关产品推荐

