记录下自己在实际进行封装item的时候,出现的一个现象bug,
以自己实际的测试为标准:
封装绘制一个圆的控件的时候,直接对paint()函数进行重新,也对该
代码如下:
painter->setPen(QPen(QBrush(penColor),0));
painter->drawEllipse(QRectF(m_x,m_y,m_width,m_height));
painter->setBrush(QBrush(QColor(255,0,0)));
boundingRect()函数如下:
QRectF rf = QRectF(m_x,m_y,m_width,m_height);
return rf;
对,上述代码测试都是没有问题,是显示上都没有问题,但是如果我需要对绘制的rect区域进行拖动或者放大缩小的话就会出现问题,你会发现,你封装的item的对象的new的实例的pos一直都是(0,0),
这就导致了在拖动和放大缩小的时候,尤其是拖动的时候会出现乱七八糟的状况,
将上述的代码改为
painter->setPen(QPen(QBrush(penColor),0));
painter->drawEllipse(QRectF(0,0,m_width,m_height));
painter->setBrush(QBrush(QColor(255,0,0)));
boundingRect()函数如下:
QRectF rf = QRectF(0,0,m_width,m_height);
return rf;
同时要确定在移动的时候需要对item的pos进行设置,(setPos()函数)
上述出现的原因是,不管是paint()函数还是boundingRect()函数的中的QRect(qreal x,qreal y,qreal w,qreal h),只是表示在item的某个位置的区域,和item本身是没有关系的,所以在对item移动和缩放操作的时候,改变QRect中的x,y是没有任何意义的(有一点意义就是在界面上是没问题的,但是本身的逻辑就已经出问题了,这在复杂的情况下就会出现逻辑上bug)。而且对应的QRect中的x,y都是相对于item的本身的坐标作为参考系的。
如果只是单纯的达到显示效果,那么第一种封装方法是可以的。
分享学习