• Qt 自定义QGraphicsItem


    简述:
    QGraphicsItem 是场景中 item 的基类。图形视图提供了一些典型形状的标准 item,例如:矩形 ( QGraphicsRectItem )、椭圆 ( QGraphicsEllipseItem ) 、文本项 ( QGraphicsTextItem )。当这些不满足需求时(例如:在一些复杂的工作流场景中),往往需要自定义,通常的做法就是继承 QGraphicsItem。

    自定义 QGraphicsItem
    要实现自定义 item,需要覆盖 QGraphicsItem 的两个纯虚函数:

    void paint() : 以本地坐标绘制 item 的内容

    QRectF boundingRect()  : 将 item 的外边界作为矩形返回由 QGraphicsView 调用以确定什么区域需要重绘。
    除此之外,可能还需要附加其他需求,例如:QPainterPath shape() - item 的形状 由 contains() 和 collidesWithPath() 用于碰撞检测。如果未实现,则默认为 boundingRect()。
    使用信号/槽、属性机制:继承 QObject 和 QGraphicsItem(或直接继承 QGraphicsObject)
    处理鼠标事件:重新实现 mouse***Event()
    处理键盘事件:重新实现 key***Event()
    处理拖放事件:重新实现 drag***Event()、dropEvent()
    ……

    Bounding Rect 和 Shape
    先来一张效果图,解释 Bounding Rect 和 Shape 的联系与区别:

    20161215123125054

    Bounding Rect

    将 item 的外边界定义为矩形,所有绘制必须限制在此区域内,QGraphicsView 使用它来确定 item 是否需要重绘。

    虽然 item 的形状可以是任意的(例如:直线、椭圆、矩形 ),但是 bounding rect 总是矩形,并且不受 item 变换的影响。

    Shape

    以本地坐标中的 QPainterPath 形式返回 item 的形状。形状可用于许多事情,包括:碰撞检测,命中测试以及 QGraphicsScene::items() 函数。

    shape() 默认实现调用 boundingRect() 返回一个简单的矩形形状,但子类可以重新实现该函数,以返回非矩形 item 更准确的形状。例如,一个圆形 item 可以选择返回椭圆形状,以便更好地进行碰撞检测。

    shape() 由 contains() 和 collidesWithPath() 的默认实现调用。

  • 相关阅读:
    offsetheight和clientheight和scrollheight的区别以及offsetwidth和clientwidth和scrollwidth的区别
    响应时间控制
    浏览器兼容
    生成随机数
    递归加载目录
    用委托定义的冒泡排序法
    ref 与out
    二维数组与交错数组的理解
    C#学习
    Jquery选择器
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13518331.html
Copyright © 2020-2023  润新知