图形视图框架
项目名称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);也是以那个点为参考零点的 |