【PyQt】QGraphicsView场景导出为图片

1 需求

需要将用户绘制的场景导出为图片。即

QGraphicsView中的Scene导出为图片。

2 代码

# 提示:此函数应能访问 QGraphicsView 对象。
# 参考:作者的项目中,此函数在某个QMainWindow类中,作为导出按钮的槽函数。

import sys
import PyQt5.QtGui

def slotExpMap(self):
    """将图形导出为图片保存"""
    # 注意view设置的sceneRect会遮盖scene设置的sceneRect
    # 此处要根据你的代码修改,也可能是:
    # sceneWidth = self.view.scene().sceneRect().width()
    sceneWidth = self.view.sceneRect().width()  # 场景宽度
    sceneHeight = self.view.sceneRect().height()

    # 空白图片
    img = QImage(int(sceneWidth), int(sceneHeight), PyQt5.QtGui.QImage.Format.Format_RGB32)

    # 将空白图片作为painter的painter device,即绘图设备
    painter = QPainter()
    painter.begin(img)  # 开始绘制

    # 图片等待绘制的区域
    targetRect = QRectF(0, 0, sceneWidth, sceneHeight)

    # 场景被临摹(拍照)的区域
    sourceRect = QRectF(-sceneWidth/2, -sceneHeight/2, sceneWidth, sceneHeight)

    # 开始渲染绘制
    self.view.scene().render(painter, targetRect, sourceRect)

    # 必须手动关闭绘制painter,原Qt(C++)由析构函数自动调用,但在Python中需手动调用
    painter.end()

    # 用户选择保存位置的对话框,返回:文件路径,文件类型
    destpath, filetype = QFileDialog.getSaveFileName(self, "文件保存", "hello.png", "图片 (*.png)")

    imgWriter = QImageWriter(destpath)  # 使用imgWriter更加安全,可显示错误提示
    if destpath:  # 如果获取的路径非空
        if imgWriter.write(img):
            QMessageBox.information(self, "提示", "导出成功")
        else:
            QMessageBox.information(self, "错误", imgWriter.errorString())
    else:
        QMessageBox.information(self, "提示", "未选择保存位置,文件保存操作已取消")

3 运行效果

4 特别说明

因对painter类不熟悉,在调试时,总是出现图片正常保存后,程序报

进程已结束,退出代码-1073740791(0xC0000409)

 的错误。仅有错误代码,无任何提示文字,完全无从下手。后按照 此文 对PyCharm进行设置之后,才出现错误提示。

QPaintDevice: Cannot destroy paint device that is being painted

绘图设备:不能销毁还在绘制的设备。

很明显,painter没有正常的结束绘制过程。 

作为局部变量先声明先入栈的 img 在函数结束时,先出栈被销毁,但是此时 painter 还没有释放 img(painter device),于是互相产生矛盾,painter 生气了,导致程序闪退!

然后,我认真的把 painter的 begin() 和 end() 都写上去。程序莫名其妙退出的问题也解决了。

5 总结

使用Painter时,最安全的做法是使用 beging() 和 end() 方法。

# 最安全的方法
painter = QPainter()
painter.beging(img)
# 绘制图形时, 等待绘制的设备img 始终被painter占用
painter.end()
# 有始有终

而不是简单的使用 painter = QPainter(img)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/92277.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据采集:selenium 获取 CDN 厂家各省市节点 IP

写在前面 工作需要遇到,简单整理理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对…

【C++】5、构建:CMake

文章目录 一、概述二、实战2.1 内部构建、外部构建2.2 CLion Cmake 一、概述 CMake 是跨平台构建工具,其通过 CMakeLists.txt 描述,并生成 native 编译配置文件: 在 Linux/Unix 平台,生成 makefile在苹果平台,可以生…

HTML5岗位技能实训室建设方案

一 、系统概述 HTML5岗位技能技术是计算机类专业重要的核心课程,课程所包含的教学内容多,实践性强,并且相关技术更新快。传统的课堂讲授模式以教师为中心,学生被动式接收,难以调动学生学习的积极性和主动性。混合式教学…

Maven聚合项目(微服务项目)创建流程,以及pom详解

一、创建流程 1、首先创建springboot项目作为父项目 只留下pom.xml 文件&#xff0c;删除src目录及其他无用文件 2、创建子项目 子项目可以是maven项目&#xff0c;也可以是springboot项目 3、父子项目关联 4、父项目中依赖管理 <?xml version"1.0" encoding…

9个python自动化脚本,PPT批量生成缩略图、添加图片、重命名

引言 最近一番在整理资料&#xff0c;之前买的PPT资源很大很多&#xff0c;但归类并不好&#xff0c;于是一番准备把这些PPT资源重新整理一下。统计了下&#xff0c;这些PPT资源大概有2000多个&#xff0c;一共30多G&#xff0c;一个一个手动整理这个投入产出比也太低了。 作为…

AI 浪潮下,W3AI 如何增强和激励 Web3 玩家研究和决策力?

更加个性化的 AI 服务是怎样的&#xff1f;近年来&#xff0c;不少主打 AI 服务的 Web3 初创项目开始兴起&#xff0c;凭借语音、文字、图像等全方位的用户数据跟踪和使用习惯定义&#xff0c;场景化的 AI Web3 产品开始围绕用户的工作、生活日常提供智能服务。这其中&#xff…

如何使用腾讯云服务器搭建网站?

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网分享使用腾讯云服务器建站教程&#xff0c;新手站长搭…

Keepalived双机热备

目录 前言 一、实验拓扑 二、配置web节点 三、配置双机热备 四、测试 ​编辑 总结 前言 Keepalived 是一个基于 VRRP 协议来实现的 LVS 服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 原理 在一个 LVS 服务集群中通常有主服务器&#xff08;MAS…

docker 内apt-get安装软件都不好使

报各种错误 apt-get install --no-install-recommends libboost-all-dev Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed:autoconf automake autotools-dev cpp-8 gc…

拼多多开放平台的API接口可以获取拼多多电商数据。以下是API接口流程

使用拼多多开放平台的API接口可以获取拼多多电商数据。以下是一般的API接口流程&#xff1a; 1. 注册开发者账号&#xff1a;首先&#xff0c;您需要在拼多多开放平台注册一个开发者账号。通过开发者账号&#xff0c;您可以获得API密钥和其他必要的信息。 2. 鉴权与认证&…

查看windows当前占用的所有端口、根据ipt终止任务进程、OS、operatingSystem

文章目录 查询端口查询指定端口根据进程pid查询进程名称查看所有进程名称根据pid终止任务进程根据进程名称终止任务 查询端口 netstat -ano查询指定端口 netstat -ano | findstr "80"根据进程pid查询进程名称 tasklist | findstr "660"查看所有进程名称 ta…

Flutter Cannot run with sound null safety, because the following dependencies

flutter sdk 版本升级到2.0或者更高的版本后&#xff0c;运行之前的代码会报错 Error: Cannot run with sound null safety, because the following dependencies dont support null safety:- package:flutter_swiper- package:flutter_page_indicator- package:transformer_p…

python 面试题--3(15题)

目录 Python中的生成器是什么&#xff1f;如何创建一个生成器&#xff1f; 解释Python中的递归函数及其使用场景。 Python中的迭代器和可迭代对象有什么区别&#xff1f; 什么是Python中的模块和包&#xff1f;它们有什么区别&#xff1f; 如何在Python中处理异常&#xf…

MySQL数据库中间件Mycat介绍及下载安装(教程)

一&#xff0c;介绍 MyCat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用MySQL一样来使用MyCat&#xff0c;对于开发人员来说根本感觉不到MyCat的存在。 开发人员只需要连接MyCat即可&#xff0c;而具体底层用到几台数据库&#xff0c;每一台数据库服务器…

有序充电运营管理平台是基于物联网和大数据技术的充电设施管理系统-安科瑞黄安南

随着我国能源战略发展以及低碳行动的实施&#xff0c;电动汽车已逐步广泛应用&#xff0c;而电动汽车的应用非常符合当今社会对环保意识的要求&#xff0c;以及有效节省化石燃料的消耗。 由于其没有污染排放的优点以及政府部门的关注&#xff0c;电动汽车将成为以后出行的重要…

JAVA坦克大战游戏v3

JAVA坦克大战游戏v3 素材 bomb_3.gif bomb_2.gif bomb_1.gif 项目结构 游戏演示 MyTankGame3.java /*** 功能:坦克游戏的5.0[]* 1.画出坦克.* 2.我的坦克可以上下左右移动* 3.可以发射子弹,子弹连发(最多5)* 4.当我的坦克击中敌人坦克时&#xff0c;敌人就消失(爆炸的效…

第一个VUE程序?

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head> <body><div id"app">{{message}} </div><!-- 1.导入Vue.js --> <script s…

【python】python智能停车场数据分析(代码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

linux操作系统的权限的深入学习(未完)

1.Linux权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限的事情。 超级用户的命令提示符是“#”&#xff0c;普通用户…