QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?
来源:互联网 发布:宝宝网络语言什么意思 编辑:程序博客网 时间:2024/05/19 02:39
前言
最近一直使用QGraphicsView框架在我的一个实际项目中,官方文档好多都没说清楚啊,有木有?!文档都翻光了,却还是有好多没明白。
一个令我恼火的bug就是,明明log打出来的每个Item的坐标都是预期的,但为什么最后结果不对呢?
我在视图中添加了一个直线项(QPoint(0,0),QPoint(100,100));
结果却是:
有的同行看到可能会一下指出,我没有设置QGraphicsScene的SceneRect,所以所有的元素默认显示。
是的,上面这个例子的确如此,但是即使我们设置了呢,结果却是这样:
直线项确实不居中了,但是端点也没有在左上角啊!下面,我们就来深入结合例子弄清楚这一些问题。
解决之道
先上demo代码,很简单,
mainwindow.h
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
mainwindow.cpp
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
main.cpp
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
这份代码确实是QGraphicsScene和QGraphicsView的基本代码,并没有设置QGraphicsScene的sceneRect,所以结果也是大家可以预测的那样居中显示:
但是!很多时候框架中自认为很令人方便的设计一点都不利于我们开发,我们开发人员习惯的坐标系统是左上角为(0,0)的坐标系统!
于是,官方给出了解决方案:使用void setSceneRect(const QRectF & rect)控制sceneRect区域,这很人迷惑,就在我们这个例子中,我们想让scene左上角坐标是(0,0),是不是说只需要scene->setSceneRect(QRectF(0,0,W,H)就可以了呢?很遗憾的是,实验结果告诉我们不是:
我们在上面的mainwindow.cpp里面设置scenRect为(0,0,150,150)试试看!:
mainwindow.cpp
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
结果是:
结果不是预期!
其实,正确的解决方案是setSceneRect(0,0,W,H);而且需要
- W>=static_cast< QWidget *>(graphicsScene->parent())->size().width()
- H>=static_cast< QWidget *>(graphicsScene->parent())->size().height()
看再次修改后的代码:
mainwindow.cpp
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
运行结果:
下面有相应的工程下载:
戳我下载
http://blog.csdn.net/tianyuan521521/article/details/46290525
- QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?
- QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?
- QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?
- QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?
- 关于QGraphicsView里使用QGraphicsScene背景图片平铺的问题
- 在Oracle中建表时容易忽视的一个小问题
- QGraphicsScene QGraphicsView QGraphicsItem-----
- QGraphicsScene QGraphicsView QGraphicsItem
- QT QGraphicsView QGraphicsScene用法
- java 学习中容易忽视的问题!!
- java 学习中容易忽视的问题!!
- java 学习中容易忽视的问题!!
- 一个容易忽视的存储过程问题
- 容易忽视的oracle函数问题--数据类型
- 问题的本身往往容易被忽视
- calendar设置月份容易忽视的问题
- 黑马程序员-容易忽视的问题
- 容易被忽视的一些PHP问题
- bootstrap-datepicker实现年、月、日动态切换
- How to Install a BTDownloader in the PI
- java 深入理解自定义类 、构造器 、显式参数与隐式参数
- mybatis-mybatis二级缓存的配置
- CodeForces 833B 详细题解(貌似是四边形优化)
- QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?
- 多校赛01
- 备忘录模式
- PhpStorm格式化快捷鍵
- KMP匹配算法复习。。
- python学习(三)之list和tuple
- UVALive 7525
- docker容器内通过supervisor来守护进程
- FreeRTOS系统配置