Qt 为什么我的QGraphicsWidget在';的边界框仍在视图中?
我有一个QGraphicsWidget,它代表地图上的一条线。当边界矩形底部的一小部分移出场景时,对象将消失。当它的边框右侧的一部分离开场景时,它也会消失。下面是正在发生的事情的说明 绿色框是从对象的绘制功能绘制的边界矩形 现在,我平移场景,以便只有这部分对象可见。它仍在考虑之中。但是,如果再向右平移,对象将消失,尽管视口中仍有一半的边界矩形 向下平移以使对象底部离开视口时也会发生同样的情况。如果我向下平移比向下平移更多,对象就会消失 以下是绘制功能:Qt 为什么我的QGraphicsWidget在';的边界框仍在视图中?,qt,qgraphicsview,qgraphicsscene,qgraphicsitem,qgraphicswidget,Qt,Qgraphicsview,Qgraphicsscene,Qgraphicsitem,Qgraphicswidget,我有一个QGraphicsWidget,它代表地图上的一条线。当边界矩形底部的一小部分移出场景时,对象将消失。当它的边框右侧的一部分离开场景时,它也会消失。下面是正在发生的事情的说明 绿色框是从对象的绘制功能绘制的边界矩形 现在,我平移场景,以便只有这部分对象可见。它仍在考虑之中。但是,如果再向右平移,对象将消失,尽管视口中仍有一半的边界矩形 向下平移以使对象底部离开视口时也会发生同样的情况。如果我向下平移比向下平移更多,对象就会消失 以下是绘制功能: void AirwayGraphic
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; }
AirwayGraphicsWidget::AirwayGraphicsWidget(常量stds::rdb::模型::途中航路*aw,QGraphicsItem*父项)
:RDBEntityGraphicsWidget(aw,父级)
,m_bounding_rect()
,m_aw_obj(aw)
,m_lod(详细级别::无)
,m_悬停(false)
{
双倍最高水平=标准::数值极限::最低();
双最低水平=标准::数值极限::最大();
双倍最高值=标准::数值极限::最低();
双下限=标准::数值极限::最大值();
用于(自动和全轮驱动:m_aw_obj->AirwayData()){
如果(-awd.实体->位置().纬度>最高纬度){
最高纬度=-awd.entity->Pos().纬度度;
}
如果(-awd.实体->位置().纬度度<最低纬度){
最低纬度=-awd.entity->Pos().纬度度;
}
如果(awd实体->位置().经度>最高经度){
最高经度=全轮驱动实体->位置()经度;
}
if(全轮驱动实体->位置().经度<最低经度){
最低经度=全轮驱动实体->位置()经度;
}
m_点。推回(QPointF(awd.实体->位置().经度度,-awd.实体->位置().纬度度));
}
最高纬度+=5.0*geom::纳米到度;
最低纬度-=5.0*geom::纳米至度;
最高_lon+=5.0*geom::NM_至_度;
最低_lon-=5.0*geom::NM_至_度;
准备计量变更();
m_bounding_rect=QRectF(QPointF(最高长度,最高宽度),QPointF(最低长度,最低宽度));
setPreferredHeight(m_bounding_rect.height());
setPreferredWidth(m_bounding_rect.width());
setAcceptHoverEvents(true);
}
QRectF AirwayGraphicsWidget::boundingRect()常量{return m_bounding_rect;}
show the boundingRect()方法提供一个相当多的代码来获取带有缩放平移图形视图的qt应用程序。如果您提供一个,显然我不是说您的整个项目,而是一个再现您的问题并只关注于同时完成的所需功能的最小项目,也就是说,你不缺乏任何外部的东西,能够执行它使我们的生活更容易,如果你努力,你会得到更快的反应,如果你不努力,你可能不会得到任何反应,所有的努力都有回报。