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