#include "CustomItem.h"
#include <QPainter>
CustomItem::CustomItem(QGraphicsItem *parent)
: QGraphicsLineItem(parent)
{
}
CustomItem::~CustomItem()
{
}
void CustomItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
double scaleFactor = painter->matrix().m11();
// QPainter::pen()方法需要注意一下
// 如果之前没有给item设置画笔的话,返回的是一个线宽为0,颜色为黑色,线型为实现的画笔;
// 具体看下行Qt助手中的说明;
// Returns the item's pen, or a black solid 0-width pen if no pen has been set.
// 一般的话如果我们想要给线宽设成某一宽度,并且线宽不随view放大缩小而改变,那就在view放大缩小时重新设置线宽;
// 获取到当前的线宽,这里的线宽其实还是之前设置的线宽值;
// 比如我们之前设置线宽为 2 ,这里返回的线宽还是 2 ,但是当前的缩放比例变了;
// 其实当前的线宽就相当于 penWidth * scaleFactor;
// 所以如果我们想要让线宽保持不变,那就需要进行转换,即 penWidth = penWidth / scaleFactor;
QPen myPen = this->pen();
// 重新设置画笔线宽;
myPen.setWidthF(myPen.widthF() / scaleFactor);
painter->setPen(myPen);
// 这里就不能用__super::paint(painter, option, widget);方法了;
// 因为源码中会重新调用painter->setPen(this->pen());导致线宽设置无效了;
painter->drawLine(this->line());
// 如果这里想调用__super::paint(painter, option, widget);
// 那就定义一个成员变量m_penWidth来保存初次设置画笔的宽度(写一个set方法);
// myPen.setWidthF(m_penWidth / scaleFactor);
// this->setPen(pen);
// __super::paint(painter, option, widget);
}
评论3
最新资源