QT自定义图形项中的boundingRect()和shape()函数的理解
实现自定义图形项经常需要重绘的函数有boundingRect()、paint()、shape()。
针对霍亚飞的Qt creator中所说,boundingRect()函数具有以下特点:
1.paint绘制的图像必须在boundingRect()函数之中。
2.用来确定哪些区域需要重构(repaint)。
3.用来检测碰撞
其中第二个功能在帮助文档中没有看到(可能英语水平不过关),故而通过一次小测试借以理解以上函数:
对第一点和第二点的理解:为什么图像的绘制必须在boundingRect()函数所确定的Rect之中。
第一个测试:我们把图像画到boundingRect()的所设置的矩形外边,并且想办法观察到重绘的情况
项目建立之类的就不说了,自行参照书本。
首先搭建个测试的框架:
添加一个继承自QGraphicsItem的MyIetm和继承自QGraphicssView的MyView,两个类的内容如下:
//myitem.h内容如下
#ifndef MYITEM_H
#define MYITEM_H
#include <QGraphicsItem>
class MyItem : public QGraphicsItem
{
public:
MyItem();
QRectF boundingRect()const override;
void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget)override;
private:
void drawRectPath(QPainter *painter);
};
#endif // MYITEM_H
//myitem.cpp内容如下:
#include "myitem.h"
#include <QPainter>
MyItem::MyItem()
{
}
QRectF MyItem::boundingRect()const {
qreal penwidth=1;
return QRectF(-50-penwidth/2,-50-penwidth/2,100+penwidth,100+penwidth);
}
void MyItem::drawRectPath(QPainter *painter){
QPainterPath rectPath;
rectPath.moveTo(-50,-50);
rectPath.lineTo(50,-50);
rectPath.lineTo(50,50);
rectPath.lineTo(-50,50);
rectPath.closeSubpath();//返回绘图开始点
painter->setPen(QPen(Qt::red,20,Qt::SolidLine,Qt::SquareCap,Qt::MiterJoin));//pen参数别设置错了,要