我有一个QGraphicsWidget,代表地图上的一条线。当边界矩形底部的一小部分移出场景时,对象消失。当它的边界的右侧部分离开场景时,它也会消失。以下是正在发生的事情的说明。
绿色框是从对象的绘制函数绘制的边界矩形。
现在我平移场景,以便只有这么多的物体可见。它仍在视野中。但是,如果我再向右平移,则尽管其中一半的边界仍然在视口中,该对象仍会消失。
向下平移时会发生同样的事情,以便对象的底部离开视口。如果我再向下平移,则对象消失。
这是绘画功能:
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; }