决定QGraphiciItem图形项自身坐标系统零点的最关键的地方

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 03:31   11   0

图形视图框架

项目名称setSceneRect

myitem.h

#ifndefMYITEM_H

#defineMYITEM_H

#include<QGraphicsItem>

classMyItem:publicQGraphicsItem

{

public:

MyItem();

QRectFboundingRect()const;

voidpaint(QPainter*painter,constQStyleOptionGraphicsItem*option,

QWidget*widget);

};

#endif//MYITEM_H

myitem.cpp

#include"myitem.h"

#include<QPainter>

MyItem::MyItem()

{}

QRectFMyItem::boundingRect()const

{

returnQRectF(-10,-10,20,20);

}

voidMyItem::paint(QPainter*painter,constQStyleOptionGraphicsItem*option,

QWidget*widget)

{

painter->setPen(QPen(Qt::red));

painter->drawRect(-10,-10,20,20);

painter->drawLine(0,0,100,100);

}

main.cpp

#include<QApplication>

#include"myitem.h"

#include<QGraphicsView>

#include<QGraphicsScene>

intmain(intargc,char*argv[])

{

QApplicationapp(argc,argv);

QGraphicsScenescene;

//scene.setSceneRect(-200,-150,400,300);

//scene.addRect(-200,-150,400,300);

///以下点的坐标都是以scene的坐标系统为参考,scene的坐标系统的原点为视野的中心

///如果没设置那么scene的原点将会随着图形项的加入而改变,以致于难以判断坐标原点

scene.setSceneRect(-100,-75,200,150);//设置场景范围

scene.addRect(-100,-75,200,150,QPen(Qt::red));//把场景范围直观显示出来,只为了方便理解

MyItem*item=newMyItem;

scene.addItem(item);

item->setPos(0,0);//设置图形项目的位置,那么这个点将作为图元自身坐标系的原点

QGraphicsViewview(&scene);

view.resize(400,300);

//把场景区域范围放大至(400,300)那么大,那么场景里面的图元也相应放大了

view.fitInView(scene.sceneRect(),Qt::KeepAspectRatioByExpanding);

view.setBackgroundBrush(QPixmap("../setSceneRect/background.png"));

view.show();

returnapp.exec();

}

下面重点解释一下图形项目的坐标系统原点

Item->setPos(x,y)//设置图形项目在scene的位置为(x,y),那么(x,y)这个点就将作为图元自身坐标系的原点,一切在图元的绘制都将以这个点为参考零点。而书上说图像项目是以它中心为原点的,这种说法不妥,刚开始图形项并没有宽度和高度。相反voidMyItem::paint(QPainter*painter,constQStyleOptionGraphicsItem*option,

QWidget*widget)

{

painter->setPen(QPen(Qt::red));

painter->drawRect(-10,-10,20,20);

painter->drawLine(0,0,100,100);

}

这个函数绘制出来的能看得见的图形项的矩形,正是以上面那个点位参考零点的;但是这种情况使的这个点刚好位于图形项的中间,从而给人一种误解,说成参考零点是图形项的中心,这就大错特错了;如果我把painter->drawRect(-10,-10,20,20);改成painter->drawRect(0,0,20,20)那么上面那个点将位于这个矩形的左上角(自己修改验证),此时的0,0恰好也印证了参考零点就是上面那个点。painter->drawLine(0,0,100,100);也是以那个点为参考零点的

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP