我有一个继承自QGraphicsLineItem的类,一旦我覆盖了paint方法,它看起来就像Qt开始在每个“主循环”中绘制它,而不是根据某些事件绘制(比如移动项目等)。
从QGraphicsItem继承时,是否有人了解更多有关良好做法的信息?我看看其他projets的代码,看起来它不是来自我的paint方法。我在想,也许我在paint方法中做了一些错误,将项目状态更改为“再次绘制”,因此Qt再次绘制它。我加入了方法代码。该方法绘制了一个箭头。
void Message::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
QLineF line = this->line();
Instance* from = dynamic_cast<Instance*> (this->from_get());
Instance* to = dynamic_cast<Instance*> (this->to_get());
QPointF from_pt(from->x() + from_pos_.x(), from->y() + from_pos_.y());
line.setP1(from_pt);
this->setLine(line);
QPointF to_pt(to->x() + to_pos_.x(), to->y() + to_pos_.y());
line.setP2(to_pt);
this->setLine(line);
textItem_->setPos(this->boundingRect().center().x() - textItem_->boundingRect().width() / 2,
this->boundingRect().center().y() - textItem_->boundingRect().height() / 2);
rectItem_->setRect(textItem_->x(), textItem_->y(), textItem_->boundingRect().width(), textItem_->boundingRect().height());
if (this->line().dy() >= 0)
{
int arrowSize = 14;
double angle = ::acos(this->line().dx() / this->line().length());
QPointF arrowP1;
QPointF arrowP2;
QPolygonF p;
angle = (Pi * 2) - angle;
arrowP1 = this->line().p2() - QPointF(sin(angle + Pi / 3) * arrowSize, cos(angle + Pi / 3) * arrowSize);
arrowP2 = this->line().p2() - QPointF(sin(angle + Pi - Pi / 3) * arrowSize, cos(angle + Pi - Pi / 3) * arrowSize);
p << this->line().p2() << arrowP1 << arrowP2;
extremity_->setPolygon(p);
extremity_->update(extremity_->boundingRect());
}
extremity_->paint(painter, option, widget);
QGraphicsLineItem::paint(painter, option, widget);
}
感谢您的帮助!
答案 0 :(得分:4)
您可能不应在setPos
方法中调用setRect
,setPolygon
,update
或paint()
等方法。这些方法可能会安排一个新的绘制事件,这将导致无限递归。