【PyQt】QGraphicsView场景导出为图片

news2024/11/17 2:57:46

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.coloradmin.cn/o/936443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QGIS学习2-QGIS设置中文界面、导出地图、修改显示投影、自定义投影等

1、设置中文界面 参照官方给的提示: https://qgis.org/en/site/getinvolved/translate.html 2、QGIS功能介绍 QGIS支持功能还是很全面的。 而且提供了很全面的插件库 https://plugins.qgis.org/plugins/ 3、工程文档介绍 可以直接从菜单栏对工程文档进行操作…

SpringBoot在IDEA里实现热部署

使用步骤 1.引入依赖 <!--devtools热部署--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><scope>true</scope><versi…

QChart——折线

Qchart的图形显示依附于QChartView&#xff0c;创建一个QChartView继承类&#xff0c;通过窗口部件的提升进行图表的显示 一、简单认识QLineSeries QLineSeries属于折线类&#xff0c;它继承于QXYSeries类&#xff0c;可以使用QXYSeries类所有方法&#xff0c;对折线进行属性设…

Jmeter(二十八):beanshell的使用

Beanshell 是一种轻量级的 Java 脚本,纯 Java 编写的,能够动态的执行标准 java 语法及一些扩展脚本语法,类似于 javaScript,在工作中可能用的多的就是: Beanshell 取样器:跟Http取样器并列Beanshell前置处理器:一般放在Http请求下,在请求前处理一些数据Beanshell后置处…

Spring Boot进阶(59):【实战教程】使用Spring Boot集成InfluxDB时序数据库,打造高效数据监控系统!

1. 前言&#x1f525; 前几期我们陆续讲解了Mysql、Redis、PostgreSQL、MongoDB等数据库集成及使用案例&#xff0c;接下来&#xff0c;bug菌继续给同学们介绍一种特殊的数据库&#xff0c;到底是什么数据库呢&#xff1f;它就是InfluxDB(时序数据库)&#xff0c;InfluxDB是一款…

Docker vs. Podman: 选择容器技术的智慧之选

嗨&#xff0c;各位亲爱的程序员小伙伴们&#xff01;当我们步入容器技术的世界&#xff0c;往往会在众多选择中迷茫。两个备受瞩目的容器工具&#xff0c;Docker 和 Podman&#xff0c;都在业界掀起了一股风潮。今天&#xff0c;我将带你深入探索&#xff0c;为什么在 Docker …

day 40 | 139. 单词拆分

139. 单词拆分 首先要明确这个是求排列数&#xff0c;所以是先遍历背包&#xff0c;再遍历物品。 func wordBreak(s string, wordDict []string) bool {dp : make([]bool, len(s) 1)dp[0] truefor j : 1; j < len(s); j{for i : 0; i < len(wordDict); i{if j - len…

Sloare flare网卡信息

详细的安装信息 https://github.com/Xilinx-CNS/onload/tree/master/scripts 进行下载 Solarflare网卡开发:openonload 安装与调试_openonload安装_Erice_s的博客-CSDN博客 cns-sfnettest测试 cns-sfnettest 下载

李沐pytorch学习-BatchNormalization

一、意义 在使用较深的网络时&#xff0c;BatchNormalization&#xff08;批量归一化&#xff09;几乎是必需的&#xff0c;可以加速收敛。 对于图1所示的全连接层神经网络&#xff0c;输出节点的GroundTruth为&#xff0c;损失函数为&#xff0c;则损失对权重的梯度为&#xf…

char *str 与char str[]的区别与联系

char *str 与char str[]的区别与联系 常用以下两种方式定义字符串&#xff1a;一种是字符数组&#xff0c;另一种是指向字符串的指针。 文章目录 char *str 与char str[]的区别与联系一、基本概念区别二、名称含义区别三、底层属性区别1.char *str "abcdefgh"2.cha…

MDK 5.xx.0 + STM32F10x 笔记

天才脑袋比不上烂笔头, 写给自己看, 自用资料。 安装MDK STM32环境 Download MDK安装 MDK -> c:\keil_v5 用默认路径下载 ARMCC V5.06 Update 7 (build960) <- 长期稳定支持版本安装至 c:\keil_v5\arm\ARMCC开启 uVision.设定 预设编译程序版本 : V5.06 Update 7 (bui…

C# 学习笔记--个人学习使用 <1>

C# 学习笔记 Chapter 1 C# 比较软的基础部分Section 1 类与命名空间Part 1 命名空间 NameSpacePart 2 类 Class Section 2 基本元素Section 3 数据类型Part 1 什么是类型&#xff1f;Part 2 类型在 C Sharp 中的作用Part 3 C Sharp 中的数据类型 Section 4 变量、对象与内存Par…

GIthub 无法访问使用Watt Toolkit加速

一、使用 Watt Toolkit Watt Toolkit 是一款加速软件&#xff0c;原名是 Steam&#xff0c;后来改名为 Watt Toolkit&#xff0c;其可以让原本无法访问的 Steam 游戏社区、 GitHub 、谷歌验证码等国内难以访问的网页正常访问。 三种下载方式&#xff1a; Watt Toolkit 官网下…

STM32的时钟系统

今天&#xff0c;学习了STM32的时钟系统&#xff0c;如下为stm32的时钟树。

[牛客复盘] 牛客周赛 Round 9 20230827

[牛客复盘] 牛客周赛 Round 9 20230827 总结小美的外卖订单编号1. 题目描述2. 思路分析3. 代码实现 小美的加法1. 题目描述2. 思路分析3. 代码实现 小美的01串翻转1. 题目描述2. 思路分析3. 代码实现 小美的数组操作1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 又是…

Linux c++开发-02-g++命令行编译

有如下的文件目录结构 格式一 swap.h swap.cpp main.cpp 编译方法和结果如下&#xff1a; 格式二 swap.cpp main.cpp 使用命令&#xff1a;g main.cpp src/swap.cpp -o main.exe 解决方法使用参数 -I 格式三-将swap.cpp生成一个静态库然后链接到main.cpp中 生成…

某人事系统架构搭建设计记录

首发博客地址 https://blog.zysicyj.top/ 先大致列一下基础情况 架构必须是微服务 场景上涉及大量查询操作&#xff0c;分析操作 并发并不高 对高可用要求较高&#xff0c;不能挂掉 对安全要求高 要能过等保测试等三方测试 使用人数并不多&#xff0c;十万内 涉及很多在线编辑&…

多线程学习之解决线程同步的实现方法

一、卖票的多线程实现 需求&#xff1a;共有100张票&#xff0c;而它有3个窗口卖票&#xff0c;请设计一个程序模拟该电影院卖票 代码实现&#xff1a; /*** Author&#xff1a;kkoneone11* name&#xff1a;SellTicket1* Date&#xff1a;2023/8/26 11:32*/ public class S…

mit s0681 lab2 Trace系统调用实现

实验一 实现一个用户级别的程序&#xff0c;功能为&#xff0c;指定系统调用后&#xff0c;跟踪程序的系统调用情况 分析实验 实验目标为实现一个程序去跟踪指定程序的系统调用。因此目标有两个 实现一个程序跟踪目标程序的系统调用 实现1&#xff0c;就需要在用户这边实…

六、Json 数据的交互处理

文章目录 一、JSON 数据的交互处理1、为什么要使用 JSON2、JSON 和 JavaScript 之间的关系3、前端操作 JSON3.1 JavaScript 对象与 JSON 字符串之间的相互转换 4、JAVA 操作 JSON4.1 Json 的解析工具&#xff08;Gson、FastJson、Jackson&#xff09;4.2 ResponseBody 注解、Re…