求助关于qgraphicsitem 缩放的坐标问题

中国学网-中国IT综合信息门户
浏览器不支持嵌入式框架,或被配置为不显示嵌入式框架。
大类导航: |
列表导航:
友情链接:
因首页链接过多,部分BR小于5的已移入内页,有任何问题请联系QQ: (BR<5已移入内页)求助关于QGraphicsItem的问题_百度知道QGraphic学习笔记_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
QGraphic学习笔记
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩27页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
---------------------------------------------------------------------------------------------------------------------------首先,先上显示界面图(Embeded dialog),下面就是以该实例讲解:&1。QGraphicsItem及其衍生类以及其他可作为图元的类,总称Item(图元)类& & & Item坐标,属于局部坐标,通常以图元中心为原点(中心对称),非中心对称类,比如dialog类,一般以左上角为原点。故Item坐标的原点,需要具体问题具体分析。正方向x朝右,y朝下。除setPos函数外,所有Item类使用或得到的坐标都是该Item坐标。1)boundingRect()返回外边框的左上顶点在item中的坐标(区别于原点,原点是(0,0)点,但是外边框由于具有宽度,所以肯定在原点的左上角,因此得到的坐标肯定是(负数,负数)的),比如下图:输出: & & & && & & & &对应到显示的点位如下:&2)&
setPos的坐标是父类坐标系的坐标,一般对于item位于scene中的应用场景,setPos对应的坐标就是scene(场景)坐标,输入的位置pos意思是该图元的原点在所在的场景坐标中的坐标,即该图元在场景中放置的位置。可以通过调用pos或scenePos查看。比如下图:输入(红色框出部分):对应到显示的点位如下:&注:个人认为应该是坐标原点,也就是默认的scene与整个item的原点(即左上角dialog的原点)对齐。此时dialog外边框顶点在场景中的位置将为(负数,负数),而非(0,0)。&2。QGraphicsScene类,即scene(场景)类& & & & scene(场景)坐标,属于逻辑坐标&logical coordinates(与QPainter相同),以场景中心为原点,正方向x朝右,y朝下。图元嵌入场景中,默认场景原点与图元原点对齐。场景默认的对其方式为居中对其,这个中指的不是原点,而是所有item的Rect的中心点,是计算出来的。如果scene的大小超过view的可显示最大值,此时将改成左上角对齐显示,左上角点也不一定是场景坐标原点。如下面两图对比:&注:从上图(左上角对齐图)可以看出,场景中心不是显示的中心,显示中心是计算出来的,场景坐标就是虚拟的一个坐标中心,目的是方便计算。场景与图元整体默认原点对其,从而在上图(左上角对齐图)中,图元原点(左上角dialog的原点)与场景原点对齐,导致图元外边框的左上角顶点在场景中的坐标位置为(负数,负数),此时场景左上角点不是(0,0)而是(负数,负数)。如下图:& 1)itemsBoundingRect()返回场景中所有item的外框顶点坐标和所有item整体的长宽。由于采用动态遍历所有图元的方法,所以当图元较多时,这个计算比较耗时。如图如下:输出如下:&界面计算如下:&2)sceneRect()返回场景中可以看到的区域的顶点和长宽,可以看到的区域区别于所有图元的外边框itemsBoundingRect的顶点和长宽,一般二者是相同的,当出现图元移除时,二者才不同。因为sceneRect不能减少只能增加,故移除图元不能使可见的区域缩小,从而sceneRect不变,但是itemsBoundingRect()将减小。可以通过setSceneRect来重新设定区域的顶点和长宽。如图所示:&输出如图:&&3。QGraphicsView类,即View(视图)类& & & & 视图坐标,属于设备坐标device coordinates(与窗口相同),默认以左上点为原点,
正方向x朝右,y朝下,此时坐标总是正值。当然,也可以通过调用函数translate更改视图坐标的原点位置,从而使试图坐标既有正值又有副值。显示时,默认场景scene的左上角顶点与视图坐标原点对齐。又由于显示时默认中心对齐,当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心,同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐,视图左上角顶点不一定是原点,此时也将出现视图坐标有正值有负值。1)translate()将当前视图坐标原点平移,从而实现显示图像的平移变换。由于默认场景的左上角顶点与视图坐标原点对齐,translate()将坐标原点平移,也就实现了将场景的平移。2)rotate()将当前视图围绕视图坐标原点旋转,从而实现显示图像的旋转变换。3)size()返回视图大小,默认大小100*30,由于视图可以是无限大小而且只有在显示后才创建出实际尺寸,因此只有在showEvent中调用
size&函数才能正确显示视图大小,否则都是返回默认的100*30,因为此时视图尚未显示,即尚未形成。&
阅读(6645)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解)',
blogAbstract:'如果你英文足够好,可以参考Qt帮助文档中的:The Graphics View Coordinate System。---------------------------------------------------------------------------------------------------------------------------首先,先上显示界面图(Embeded dialog),下面就是以该实例讲解:',
blogTag:'c++,界面设计,qt',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:7,
publishTime:9,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}关于QGraphicsItem解决方案 - QT开发&&&&>>&& 关于QGraphicsItemmyitem.h
#ifndef&MYITEM_H
#define&MYITEM_H
#include&&QGraphicsItem&
#include&&QPainter&
class&MyItem&:&public&QGraphicsItem
&&&&Q_OBJECT
&&&&MyItem(QObject&*parent&=&0);
&&&&~MyItem();
protected:
&&&&QRectF&boundingRect()&
&&&&void&paint(QPainter&*,const&QStyleOptionGraphicsItem&*,QWidget&*);
#endif&//&MYITEM_H
myitem.cpp
#include&"myitem.h"
MyItem::MyItem(QObject&*parent)&:
&&&&QGraphicsItem(parent)&&&&&&&&&&&&&&&&&&//这里总是报错:no&matching&function&for&call&to&'QGraphicsItem::QGraphicsItem(QObject*&),求解
MyItem::~MyItem()
QRectF&MyItem::boundingRect()&const
&&&&qreal&penWidth=1;
&&&&return&QRectF(0-penWidth/2,0-penWidth/2,20+penWidth,20+penWidth);
void&MyItem::paint(QPainter&*painter,&const&QStyleOptionGraphicsItem&*,&QWidget&*)
&&&&painter-&setBrush(Qt::red);
&&&&painter-&drawRect(0,0,20,20);
#include&&QApplication&
#include&&QGraphicsScene&
#include&&QGraphicsRectItem&
#include&&QGraphicsView&
#include&&QDebug&
#include&"myitem.h"
int&main(int&argc,char&*argv[])
&&&&QApplication&app(argc,argv);
&&&&QTransform&transF
&&&&QGraphicsScene&
&&&&MyItem&*item=new&MyI
&&&&scene.addItem(item);
&&&&//qDebug()&&scene.itemAt(50,50,transForm)&&
&&&&QGraphicsView&view(&scene);
&&&&view.setForegroundBrush(QBrush(QColor(255,255,255,100)));
&&&&view.setBackgroundBrush(QBrush(QPixmap(":/green.jpg")));
&&&&view.resize(400,300);
&&&&view.show();
&&&&return&app.exec();
&------解决方案--------------------引用:Quote: 引用:
Quote: 引用:
Quote: 引用:
你的类型声明错了吧:
class&MyItem&:&public&QGraphicsItem
&&&&Q_OBJECT
&&&&MyItem(QObject&*parent&=&0);
&&&&~MyItem();
protected:
&&&&QRectF&boundingRect()&
&&&&void&paint(QPainter&*,const&QStyleOptionGraphicsItem&*,QWidget&*);
这个MyItem构造函数的参数不是QObject,应该是QW
还是不行啊,报错:no&matching&function&for&call&to&'QGraphicsItem::QGraphicsItem(QWidget*&)
不好意思哈,那个构造函数的参数类型是QGraphicsItem
改成这样:
class&MyItem&:&public&QGraphicsItem
&&&&Q_OBJECT
&&&&explicit&MyItem(QGraphicsItem&*parent&=&0);
&&&&~MyItem();
protected:
&&&&QRectF&boundingRect()&
&&&&void&paint(QPainter&*,const&QStyleOptionGraphicsItem&*,QWidget&*);
MyItem::MyItem(QGraphicsItem&*parent)&:
&&&&QGraphicsItem(parent)
可是这样错误更多了
是的,你看你这里函数声明:
&&&&void&paint(QPainter&*,const&QStyleOptionGraphicsItem&*,QWidget&*);
再看看你的函数定义:
void&MyItem::paint(QPainter&*painter,&const&QStyleOptionGraphicsItem&*,&QWidget&*)
&&&&painter-&setBrush(Qt::red);
&&&&painter-&drawRect(0,0,20,20);
你应该把函数这样声明:
&&&&void&paint(QPainter&*painter,const&QStyleOptionGraphicsItem&*,QWidget&*);

我要回帖

更多关于 qgraphicssvgitem 的文章

 

随机推荐