100% загрузка ЦП при переопределении QGraphicsLineItem :: paint () - PullRequest
3 голосов
/ 06 июня 2011

У меня есть класс, унаследованный от QGraphicsLineItem, и как только я переопределяю метод рисования, похоже, Qt начинает рисовать его при каждом "основном цикле", вместо рисования в соответствии с некоторыми событиями (например, перемещением элемента и т. Д.).

Кто-нибудь знает больше о хороших практиках при наследовании от QGraphicsItem?Я смотрю на код других проектов и похоже, что он не исходит от моего метода рисования.Я думал, что, возможно, я делаю что-то не так в методе рисования, который изменяет состояния элементов на «снова рисовать», и поэтому 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);
}

Спасибо за помощь!

1 Ответ

4 голосов
/ 06 июня 2011

Вы, вероятно, не должны вызывать методы, такие как setPos, setRect, setPolygon или update внутри вашего paint() метода.Эти методы могут запланировать новое событие рисования, которое приведет к бесконечной рекурсии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...