Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: xelax от Ноябрь 11, 2009, 15:03



Название: Немасштабируемые 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
Спасибо большое, помогло.