Russian Qt Forum
Ноябрь 25, 2024, 02:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Немасштабируемые QGraphicsItem  (Прочитано 4788 раз)
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());
}
Записан
_govorilka
Гость
« Ответ #1 : Ноябрь 11, 2009, 22:15 »

На работе была подобная проблема. Решили не использовать флаг, а увеличивать/уменьшать item через setTransform(). Вот пример кода, который реально работает в нашей программе:

Код:
QTransform matrix;

if( itemsFlags() & Item::IgnoreZoom )
{
    qreal zoom = 1. / viewZoom();
    matrix.scale( zoom, zoom );
}

setTransform( matrix );

Записан
ufna
Гость
« Ответ #2 : Ноябрь 11, 2009, 22:20 »

_govorilka, +1

делал точно так же линии привязки. Апдейт при изменении масштаба и все.
Записан
xelax
Гость
« Ответ #3 : Ноябрь 12, 2009, 17:09 »

Спасибо большое, помогло.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.138 секунд. Запросов: 20.