为什么我的QGraphicsWidget在它的边界框仍在视图中时会消失?

时间:2018-05-10 13:04:10

标签: qt qgraphicsview qgraphicsscene qgraphicsitem qgraphicswidget

我有一个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; }

0 个答案:

没有答案