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

                                              图形视图框架

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

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值