QT软件开发: 重载QGraphicsItem的type()函数

简介: QT软件开发: 重载QGraphicsItem的type()函数

一、前言

       在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);

image.png

image.png

二、 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修饰的函数其派生类必须重载。


目录
相关文章
|
18天前
QT中HASH函数方法
QT中HASH函数方法
129 0
|
18天前
|
编译器
Qt问题:Qt槽函数是否支持内联?
Qt问题:Qt槽函数是否支持内联?
17 0
|
18天前
|
编译器 C++
qt槽函数的四种写法
QT槽函数的四种写法
47 0
qt槽函数的四种写法
|
7月前
25 QT - event函数
25 QT - event函数
30 0
Qt 窗口常用位置API函数 & 绘图原理 & 双缓冲机制 总结
Qt 窗口常用位置API函数 & 绘图原理 & 双缓冲机制 总结
|
18天前
|
编译器 API
【Qt】- 信号和槽函数
【Qt】- 信号和槽函数
|
18天前
|
监控
QT按键监控函数
QT按键监控函数
|
18天前
|
算法 开发者
【Qt SDL相关问题】Qt 引入SDL导致main函数冲突的解决方案
【Qt SDL相关问题】Qt 引入SDL导致main函数冲突的解决方案
24 2
|
18天前
|
存储 JSON C++
Qt cmake 增加qml文件:深度剖析Qt cmake 的qt_add_qml_module函数
Qt cmake 增加qml文件:深度剖析Qt cmake 的qt_add_qml_module函数
67 0
|
12月前
|
C++
Vs + Qt 界面设计常用函数合集
Vs + Qt 界面设计常用函数合集

推荐镜像

更多