Почему мой QGraphicsWidget исчезает, когда его ограничивающая рамка еще видна? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть QGraphicsWidget, который представляет линию на карте. Объект исчезает, когда небольшая часть нижней части ограничивающего прямоугольника выходит за пределы сцены. Он также исчезает, когда часть правой стороны ограничивающего прямоугольника выходит за пределы сцены. Ниже приведена иллюстрация того, что происходит.

Зеленый прямоугольник - это ограничивающий прямоугольник, нарисованный из функции рисования объекта.

Object is visible

Теперь я перемещаю сцену так, чтобы видна была только эта большая часть объекта. Это все еще в поле зрения. Однако, если я поверну еще вправо, объект исчезнет, ​​несмотря на то, что половина его ограничительного прямоугольника все еще находится в области просмотра.

Object will disappear if panned one more pixel right.

То же самое происходит при панорамировании вниз, так что нижняя часть объекта покидает область просмотра. Если я поверну немного больше, чем внизу, объект исчезнет.

enter image description here

Вот функция рисования:

void AirwayGraphicsWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {


    QPen pen(m_aw_obj->AltitudeType() == stds::rdb::WPAltitudeTypes::HIGH ? COLOR_HI_AIRWAY :
    m_aw_obj->AltitudeType() == stds::rdb::WPAltitudeTypes::LOW ? COLOR_LO_AIRWAY :
    COLOR_BOTH_AIRWAY);

    pen.setWidth(3);
    pen.setCosmetic(true);
    painter->setPen(pen);
    painter->drawPolyline(m_points.data(), m_points.size());

    pen.setColor(m_is_hovered ? Qt::red : Qt::green);
    pen.setWidth(0);
    painter->setPen(pen);
    painter->drawRect(boundingRect());
}

Есть идеи о том, что здесь происходит? Я возился с этим пару дней, и у меня нет на что попробовать.

Обновление Конструктор

AirwayGraphicsWidget::AirwayGraphicsWidget(const stds::rdb::model::EnrouteAirway* aw, QGraphicsItem* parent)
: RDBEntityGraphicsWidget(aw, parent)
, m_bounding_rect()
, m_aw_obj(aw)
, m_lod(LevelOfDetail::NONE)
, m_is_hovered(false)
{

    double highest_lat = std::numeric_limits<double>::lowest();
    double lowest_lat  = std::numeric_limits<double>::max();
    double highest_lon = std::numeric_limits<double>::lowest();
    double lowest_lon  = std::numeric_limits<double>::max();

    for (auto &awd : m_aw_obj->AirwayData()) {
        if (-awd.entity->Pos().latitude_deg > highest_lat) {
            highest_lat = -awd.entity->Pos().latitude_deg;
        }

        if (-awd.entity->Pos().latitude_deg < lowest_lat) {
            lowest_lat = -awd.entity->Pos().latitude_deg;
        }

        if (awd.entity->Pos().longitude_deg > highest_lon) {
            highest_lon = awd.entity->Pos().longitude_deg;
        }

        if (awd.entity->Pos().longitude_deg < lowest_lon) {
            lowest_lon = awd.entity->Pos().longitude_deg;
        }

        m_points.push_back(QPointF(awd.entity->Pos().longitude_deg, -awd.entity->Pos().latitude_deg));
}
    highest_lat += 5.0 * geom::NM_TO_DEG;
    lowest_lat  -= 5.0 * geom::NM_TO_DEG;
    highest_lon += 5.0 * geom::NM_TO_DEG;
    lowest_lon  -= 5.0 * geom::NM_TO_DEG;
    prepareGeometryChange();
    m_bounding_rect = QRectF(QPointF(highest_lon, highest_lat), QPointF(lowest_lon, lowest_lat));

    setPreferredHeight(m_bounding_rect.height());
    setPreferredWidth(m_bounding_rect.width());

    setAcceptHoverEvents(true);
}

QRectF AirwayGraphicsWidget::boundingRect() const { return m_bounding_rect; }
...