QGraphicsItem的继承重写
- 序言
- 重点函数
- QRectF boundingRect() const
- QPainterPath shape() const
- void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0)
序言
学习途中记录一下,可谓是精华点
重点函数
QRectF boundingRect() const override;
QPainterPath shape() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) override;
其中boundingRect
与paint
是必须继承重写的,因为其在QGraphicsItem是纯虚函数。
QRectF boundingRect() const
其的功能是划出一个矩形区域,paint
里面的在boundingRect
矩形区域内绘制,QGraphicsView通过该函数来确认需要绘制的区域。
QPainterPath shape() const
其的功能是更加细致的绘制出本图形项的形状,比如镂空的圆环,其镂空位置及圆环以外的位置均点击不了,只能点击圆环选取
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0)
其的功能都了解了,就是相当于QWidget的paintEvent一样,在其中绘制该图形项的内容
举个例子:
#include <QGraphicsItem>
class CustomGraphicItem : public QGraphicsItem
{
public:
CustomGraphicItem();
QRectF boundingRect() const override;
virtual QPainterPath shape() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) override;
private:
QPainterPath ItemPath;
};
#include "CustomGraphicItem.h"
#include <QPainter>
CustomGraphicItem::CustomGraphicItem()
{
setFlag(QGraphicsItem::ItemIsMovable);
ItemPath.addEllipse(QRectF(0, 0, 100, 100));
ItemPath.addRect(QRectF(25, 25, 50, 50));
}
QRectF CustomGraphicItem::boundingRect() const
{
return QRectF(0, 0, 100, 100);
}
QPainterPath CustomGraphicItem::shape() const
{
return ItemPath;
}
void CustomGraphicItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
/* 切记,尽量减少在绘制里进行运算,最好只进行绘制操作,一切计算过程均留在其他函数。 */
/* 这样可以减少绘制消耗的效能 */
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
painter->setPen(Qt::yellow);
painter->setBrush(Qt::darkYellow);
painter->drawPath(ItemPath);
painter->restore();
}
我简单绘制了一个铜钱形状的图形项,其点击铜钱以外的地方都是无法选中的。
后续待补充…