一、前言
在QGraphicsScene 上绘制图形时,经常会使用items()这种便利函数,获取当前画布上所有的图形列表;因为绘制的时候,可能会绘制不同的图形,在得到所有的图形列表之后,通常需要对其中的 QGraphicsItem 进行类型检测,确定实际item的类型,然后对其进行类型转换得到正确的item的类型。这样既可以访问标准 item也可以 访问自定义 item。
实际的运用案例:
//获取画布上的所有图元 QList<QGraphicsItem *> items = scene->items(); //遍历画布上的所有图元 for (int i = 0; i < items.count(); i++) { //获取图元的类型 int type=items.at(i)->type(); //矩形图元 if(type==2) { qDebug()<<"矩形图元设置颜色"; //转换成正确类型 BRectangle *item=static_cast<BRectangle *>(CurrentSelectedItem_stu.item); QPen pen = item->pen(); pen.setColor(text_color); item->setPen(pen); item->SetFrameColor(text_color); } //圆形图元 else if(type==3) { qDebug()<<"圆形图元设置颜色"; //转换成正确类型 BEllipse *item=static_cast<BEllipse *>(CurrentSelectedItem_stu.item); QPen pen = item->pen(); pen.setColor(text_color); item->setPen(pen); item->SetFrameColor(text_color); } }
强制转换类型时要使用static_cast语法,常规C语言的强转语法QT会报一堆警告。
语法: static_cast<强转的目标类型>(待强转的变量); CTextItem *p=static_cast<CTextItem *>(CurrentSelectedItem_stu.item);
二、 QGraphicsItem::Type介绍
QGraphicsItem::Type 是标准 item 类中 virtual type() 函数返回的类型值。所有标准 item 与唯一的 Type 值相关联。
QGraphicsItem::UserType 是自定义 itemQGraphicsItem 或任何标准 item 的子类的最小允许类型值。该值与 QGraphicsItem::type() 的重新实现结合使用并声明一个 Type 枚举值。
QGraphicsItem里是这样定义的:
class Q_WIDGETS_EXPORT QGraphicsItem { public: ...... enum { Type = 1, UserType = 65536 }; virtual int type() const; ....... }
三、重载 type()函数
一般自己开发时,都会重载QGraphicsItem类,实现自己的类,完成对图形的统一管理,为了方便区分图形类型,就可以自己重载type()函数,完成自己的类型定义与区分。
示例:
// 自定义图元 - 基础类 class BGraphicsItem : public QObject, public QAbstractGraphicsShapeItem { Q_OBJECT public: enum ItemType { Circle = 1, // 圆 Ellipse, // 椭圆 Concentric_Circle, // 同心圆 Pie, // 饼 Chord, // 和弦 Rectangle, // 矩形 Square, // 正方形 Polygon, // 多边形 Round_End_Rectangle,// 圆端矩形 Rounded_Rectangle // 圆角矩形 }; QPointF getCenter() { return m_center; } void setCenter(QPointF p) { m_center = p; } QPointF getEdge() { return m_edge; } void setEdge(QPointF p) { m_edge = p; } //获取类型 ItemType getType() { return m_type; } //c++11中引入了override关键字,被override修饰的函数其派生类必须重载。 //修饰需要被重写 virtual int type() const override { return m_type; } //设置边框的颜色 void SetFrameColor(QColor c); protected: BGraphicsItem(QPointF center, QPointF edge, ItemType type); virtual void focusInEvent(QFocusEvent *event) override; virtual void focusOutEvent(QFocusEvent *event) override; protected: QPointF m_center; QPointF m_edge; ItemType m_type; BPointItemList m_pointList; QPen m_pen_isSelected; QPen m_pen_noSelected; };
重写type()函数时,需要加上override关键字,不然会有警告。
warning: 'type' overrides a member function but is not marked 'override'
note: overridden virtual function is here
c++11中引入了override关键字,被override修饰的函数其派生类必须重载。