qt 继承QGraphicsItem

qt提供的基本图元QGraphicsLineItem、QGraphicsTextItem、QGraphicsPixmapItem、QGraphicsPathItem等有时候并不能满足所有要求,因而在程序中通常继承QGraphicsItem或者其更具体的子类,自定义所需要的图元。继承QGraphcisItem,一般需要重写的成员函数有:
1)virtual QRectF boundingRect() const
       此函数将一个图元的边界定义为了一个矩形区域,图元的绘制范围也局限在这个矩形区域之内,同时,QGraphicsView也利用这个区域范围来决定图元是否需要重绘。图元的形状可以是任意的(如矩形、圆形、多边形等),但是边界区域总是矩形,它不会随图元的各种转换而改变。需要注意的是,通常在画边界的区域的时候要包含进半个画笔的宽度进来。如下API例子:
QRectF CircleItem::boundingRect() const
 {
     qreal penWidth = 1;
     return QRectF(-radius - penWidth / 2, -radius - penWidth / 2,
                   diameter + penWidth, diameter + penWidth);
 }
2)virtual void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget=0)
此函数决定具体的图元绘制,通常是在本地坐标中进行。参数painter进行具体的绘制,参数option定义一些图元样式,如选中时是否需要显示虚线外边框等,参数widget默认为0,即painter绘制的位置(画到哪个widget上)。如下API例子:
 void RoundRectItem::paint(QPainter *painter,
                           const QStyleOptionGraphicsItem *option,
                           QWidget *widget)
 {
     painter->drawRoundedRect(-10, -10, 20, 20, 5, 5);
 }
3)virtual QPainterPath shape() const
以QPainterPath形式返回图元形状,用户碰撞检测等操作。如下API例子
 QPainterPath RoundItem::shape() const
 {
     QPainterPath path;
     path.addEllipse(boundingRect());
     return path;
 }
4)virtual int type() const
QGraphicsItem子类类型标识,每一个标准的graphicsitem类都关联到一个唯一的int值上,当使用qgraphicsitem_cast()函数进行类型转换时,可以将各种子类型区分开。重写此函数,并且声明一个Type枚举类型,返回一个大于UserType( 65536)的整数值。如下API例子:
 class CustomItem : public QGraphicsItem
 {
    ...
    enum { Type = UserType + 1 };

    int type() const
    {
        // Enable the use of qgraphicsitem_cast with this item.
        return Type;
    }
    ...
 };

你可能感兴趣的:(qt 继承QGraphicsItem)