qt 保存绘制图片时背景变黑_QGraphicsScene绘制背景图片引起的问题

项目是基于Qt的图形视图框架编写的,现有个需求是要在图形中加入自定义的背景图片。心想不就是个背景图片吗?只要重写drawBackground函数我想怎么画就怎么画啊。于是立马从QGraphicsScene类中派生了一个CScene类,并重写了虚函数drawBackground。在该函数中绘制了一张图片。

void CScene::drawBackground(QPainter *painter, const QRectF &rect){QPixmap pixmap("F:/05_test/back.jpg"); painter->drawPixmap(rect,pixmap,QRect()); //在rect范围内绘制图片}

628415f8efc5dfaffa73f93dba3dac10.png

看看这效果,so easy啊。但是如果故事到这里就结束的话那就没意思了。 接下来我在场景中添加了两个矩形图元并拖动一个矩形。于是出现了诡异的一幕。

//创建并添加两个矩形图元到场景中

QGraphicsRectItem* rectItem1 = new QGraphicsRectItem(-20,-20,40,40);

rectItem1->setFlag(QGraphicsItem::ItemIsMovable);

QGraphicsRectItem* rectItem2 = new QGraphicsRectItem(-30,-30,60,60);

rectItem2->setFlag(QGraphicsItem::ItemIsMovable);

rectItem2->setPos(100,100);

m_pScene->addItem(rectItem1);

m_pScene->addItem(rectItem2);

e78e941be4f495ea5a14524551a1c31c.png

戒指不见了!戒指跑哪里去了?

扯远了,其实是图形中出现了残影现象,那么为什么会有残影呢?难道是图元的刷新范围不正确吗?于是设置视图的更新模式试试。

m_pView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);

设置为FullViewportUpdate后重启程序再拖动图元发现残影不见了。

然而事情到这一步还是没有结束,接下来我又在视图上加了个QLabel,并且尝试移动它。

label = new QLabel(m_pView); label->setStyleSheet("background:red;"); label->setFixedSize(100,100); label->move(100,50);

63b47670dd53d05202576fe37371a050.png

戒指又不见了!(残影又出现了)。看来设置视图的更新模式只能对图元起作用啊。

那怎么办呢?仔细观察第一次出现的残影,会发现矩形图元里居然也有背景图片。我们并没有给图元设置背景图片啊,这就更诡异了。

其实矩形图元里的背景图片并不属于矩形图元,之前出现的残影也不是更新图元或QLabel产生的。一切都是drawBackground的第二个参数在搞鬼。Qt帮助文档告诉我们rect是指暴露的矩形,我还以为是视图当前可视的矩形区域。然而事实却不是这样。打印出rect的值:

rect: QRectF(-133,-83 376x276)

rect: QRectF(67,66 66x67)

rect: QRectF(67,65 66x67)

程序刚启动时rect的大小是视图的窗口大小,拖动图元时函数给我们的rect只是比图元大一点,很显然不能满足我们的需求,至于为什么是这样也不知道。所以我们需要绘制的图片始终和视图一样大需要自己计算,可以这么写。

if(views().count() == 0) return; QGraphicsView* pView = views().first(); QRect contentRect = pView->viewport()->contentsRect(); QRectF sceneRect = pView->mapToScene(contentRect).boundingRect(); QPixmap pixmap("F:/05_test/back.jpg"); painter->drawPixmap(sceneRect,pixmap,QRect()); //在rect范围内绘制图片

测试环境:Qt5.9.4

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

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

相关文章

JavaScript | JSON基本格式

————————————————————————————————————————————————————————— JSON 语法 "use strict"; // 简单值 "hello,world" // 必须使用双引号// 对象 {"name": "hugh","age&…

Linux命令大全(文件管理)

Linux命令(文件管理命令) 1、cat命令。用于连接文件并打印到标准输出设备上。 参数: -n 从1开始对所有的输出行数进行编号 -b 和n类似,只是不算空行 -s 大于等于2个空格(连续的)当一个空格处理 -T 将Tab字符显示…

jmeter 生成计数器_使用密码摘要生成器扩展JMeter

jmeter 生成计数器最近,我不得不处理一个具有50,000条用户记录的OpenLDAP实例,并进行一些压力测试。 JMeter是填充LDAP的最佳选择。 但是,在我的情况下,OpenLDAP配置为不接受任何明文密码。 因此,我无法使用通过JMet…

c++ 查找 list中最长的字符串_查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答)...

查找不重复字符的最长子字符串(编程面试中常见题-用8种编程语言来回答)给定一个字符串str,找到不重复字符的最长子字符串。比如我们有 “ABDEFGABEF”, 最长的字符串是 “BDEFGA” 和 “DEFGAB”, 长度为6.再如 “BBBB” 最长字符串是 “B”,…

Spring Async和Java的8 CompletableFuture

众所周知,我不是Spring的最大粉丝,但是当时我在一个组织中工作,该组织使用Spring(以不同的形式和版本)维护了太多的项目。 我仍然对Spring持怀疑态度,当然有一些很好的主意,有一些很好的&#x…

JustOj 1032: 习题6.7 完数

题目描述 一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6123,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子: 输入 N 输出 ?…

mysql 触发器 本表_MySQL触发器处理本表数据

关于MySQL的触发器,基本上每个Mysql教程里都有讲到,但是我发现那些教程里讲的都是如何处理其他表的数据。在MySQL中写触发器操作关于MySQL的触发器,基本上每个Mysql教程里都有讲到,但是我发现那些教程里讲的都是如何处理其他表的数…

JS 操作cookie

平时网站的开发中cookie用的还是用的比较多的,因为cookie在客户端,所以用js操作的比较多,下面是常用的设置、查找、删除等功能实现。 function addCookie(objName, objValue, objHours){//添加cookie var str objName "" esc…

官方野生蝇群流口水分数

官方是什么? 标题太小,但有用的贡献。 Wildfly Swarm允许我们创建相当小的自包含应用程序,包括我们从Wildfly Application Server中需要的应用程序。 在这篇文章中,我们将研究与Wildfly Swarm合作使用的Drools分数 。 该部分背后的…

SQL-十步完全理解 SQL

十步完全理解 SQL http://blog.jobbole.com/55086/ 刚开始看到了 执行顺序,写得挺好的,明天继续转载于:https://www.cnblogs.com/hpyg/p/7270168.html

MySQL 高水位update_Oracle delete 高水位线处理问题

最近遇到oracle 表中数据量很大查询和更新比较慢 需要删除,发现删除后查询速度还是很慢,原来是delete oracle 高水位没有下降的最近遇到Oracle 表中数据量很大查询和更新比较慢 需要删除,发现删除后查询速度还是很慢,原来是delete…

jasperreports_JasperReports JSF插件用例–简单列表报告

jasperreports这是JasperReports JSF插件系列的第一篇“用例文章” ,我将专注于一个简单的需求,并且我将进一步深入。 起点是我们已经为图书商店完成的项目设置,我将向其中添加一个列表,其中包含在数据库中注册的其他图书&#xf…

mysql optimizer_mysql 参数optimizer_switch

mysql 5.1中开始引入optimizer_switch, 控制mysql优化器行为。他有一些结果集,通过on和off控制开启和关闭优化器行为。使用有效期全局和会话两个级别,在5.5中optimizer_swtich 可取结果如下,不同mysql版本可取结果不同。5.1和5.6参考官方文档…

2个菜鸟Java常量和枚举陷阱

在对Java和Groovy代码进行的各种代码审查中,我经常看到魔术数字和其他随机字符串在整个代码库中乱七八糟。 例如,魔术数字是下面的代码(Groovy)中的4.2: if (swashbuckle > 4.2) {... }4.2是什么意思?…

欧拉函数 euler

O - 找新朋友1、欧拉函数 euler()在数论,对正整数n,欧拉函数是 少于或等于n的数中与n 互质 的数的数目。互质:公约数只有 1 的两个整数,称为互质整数。即 最大的公约数也就是 1 euler(&#xf…

mysql cluster 外键_Mysql外键约束

Mysql集群创建外键,分为四种约束:no action,restrict,cascade,set null。如果表A的主关键字是表B中的字段,则该字段称为B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性…

Map类集合遍历

转载于:https://www.cnblogs.com/Neil223/p/7275035.html

小米10解锁bl跳过168_2021年小米红米手机官方解锁BL详细教程+跳过168小时方法合集...

MIUI的解锁风控一直在改动,从之前的无需解锁到现在的168小时绑定限制,时至2021年我们再次重新整理下小米的解锁新规则以及小米解锁常见问题解决方法。比如大家常问的如果跳过168小时解锁时间限制等等小米解锁工具下载:http://miuirom.xiaomi.…

orderby排序慢_使用@OrderBy对Spring Data MongoDB集合进行排序

orderby排序慢这是关于调整和增强Spring Data MongoDB功能的第三篇文章。 这次,我发现我错过了一个JPA功能– OrderBy批注。 OrderBy指定在检索关联值时集合值关联的元素的顺序。 在本文中,我将展示如何使用Spring Data MongoDB使用OrderBy批注实现排序 …

细节取胜的javadoc

今个以为开发经验丰富的同事提出有个改动有问题,希望改一下。老前辈发话,心虚的紧,立即看了下,问题说是我的方法凝视中写了一个 ** doesnt ** 建议改为 does not 说这个生成javadoc有问题。咦。不禁困惑,这个写法我记得…