Название: Немасштабируемые QGraphicsItem
Отправлено: xelax от Ноябрь 11, 2009, 15:03
Здравствуйте. Столкнулся со следующей проблемой: Мне надо нарисовать не масштабируемый Item на сцене. Про флаг ItemIgnoresTransformations я знаю. При выводе итема все нормально до тех пор, пока не сменишь масштаб. Он пропадает. Если вернуть масштаб - появляется. В отладчике такая ситуация: - вызов paint не происходит - вызов boundingRect происходит - просил вывести boundingRect Item'а и текущий сцены - item попадает во вьюпорт. Кто нибудь сталкивался с такой проблемой? Где то туплю, а где не ясно :( class DebugInfoWindow : public QGraphicsItem { public: DebugInfoWindow(MapView* mapView, QGraphicsItem* parent=0);
QRectF boundingRect() const; void paint(QPainter* painter ,const QStyleOptionGraphicsItem* option ,QWidget* widget);
private: QString debugInfo() const;
MapView* m_pMapView; const int m_delta; };
DebugInfoWindow::DebugInfoWindow(MapView* mapView, QGraphicsItem* parent) : QGraphicsItem(parent) ,m_pMapView(mapView) ,m_delta(5) { setFlag(ItemIgnoresTransformations); setZValue(1000000.0); }
QString DebugInfoWindow::debugInfo() const { return QString("Scale: %1\nUnits: %2").arg(1).arg(2); }
QRectF DebugInfoWindow::boundingRect() const { QFontMetricsF fm(QApplication::font()); QRectF rect(fm.boundingRect(debugInfo()));
QPointF topLeft(m_pMapView->mapToScene(QPoint(0, 0))); QPointF bottomRight(m_pMapView->mapToScene(QPoint(rect.width() + 2*m_delta ,rect.height() + 2*m_delta)));
return QRectF(topLeft, bottomRight); }
void DebugInfoWindow::paint(QPainter* painter ,const QStyleOptionGraphicsItem* option ,QWidget* widget) { painter->setPen(Qt::green); QColor c(Qt::darkGreen); c.setAlpha(120); painter->setBrush(c); painter->drawRect(boundingRect());
QPointF topLeftText(m_pMapView->mapToScene(QPoint(m_delta, m_delta))); QPointF bottomRightText(m_pMapView->mapToScene(QPoint(boundingRect().width() - m_delta ,boundingRect().height() - m_delta)));
painter->setPen(Qt::yellow); painter->drawText(QRectF(topLeftText, bottomRightText), Qt::AlignLeft,debugInfo()); }
Название: Re: Немасштабируемые QGraphicsItem
Отправлено: _govorilka от Ноябрь 11, 2009, 22:15
На работе была подобная проблема. Решили не использовать флаг, а увеличивать/уменьшать item через setTransform(). Вот пример кода, который реально работает в нашей программе: QTransform matrix;
if( itemsFlags() & Item::IgnoreZoom ) { qreal zoom = 1. / viewZoom(); matrix.scale( zoom, zoom ); }
setTransform( matrix );
Название: Re: Немасштабируемые QGraphicsItem
Отправлено: ufna от Ноябрь 11, 2009, 22:20
_govorilka, +1
делал точно так же линии привязки. Апдейт при изменении масштаба и все.
Название: Re: Немасштабируемые QGraphicsItem
Отправлено: xelax от Ноябрь 12, 2009, 17:09
Спасибо большое, помогло.
|