crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QGraphicsItem clipping, Ограничение области рисования QGraphicsItem
PAFOS
  опции профиля:
сообщение 23.4.2012, 10:51
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Доброго времени суток.

Есть сцена, ее размер предположим 500Х500. Есть итем, его размер 600Х600.
Нужно ограничить область рисования итема по размерам сцены, но особым образом:
Если итем выделен, то рамку выделения рисовать, а его содержимое ограничить сценой.

В методе paint(...) делаю так:

void PixmapItem::paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
   QStyleOptionGraphicsItem *op = const_cast<QStyleOptionGraphicsItem *>( option );

    // draw selected bounds
    if( op->state & QStyle::State_Selected )
    {
        op->state ^= QStyle::State_Selected; // <-- запрещаем рисовать базовому классу рамку выделения. Т.к. рисуем ее сами
        drawBounds(painter); // <--- тут рисуем рамку выделения
    }

    
    if( m_enableClipping )
    {
        // Ограничиваем область рисования сценой
        QPointF p = pos();

        QRectF sRect = scene()->sceneRect();
        sRect.translate(p);

        QPainterPath clipPath = QPainterPath();
    
        // Если итем имеет вращение, компенсируем его (сцена остается без вращения -> прямоугольник для обрезания тоже)
        // Например если итем имеет вращение 90градусов, то вращаем прямоугольник на -90 градусов
        QTransform t = QTransform();

        t.translate( sRect.center().x(), sRect.center().y());
        t.rotate( -rotation() );
        t.translate( -sRect.center().x(), -sRect.center().y());

        clipPath.addRect( sRect );
        clipPath = t.map(clipPath);

        // Собственно устанавливаем ограничение
        painter->setClipPath( clipPath, Qt::IntersectClip );
    }

    QGraphicsPixmapItem::paint(painter,op,widget);
}


При вращении итема равному 0 градусов все идеально. (см. скрин 1)
при любом вращении прямоугольник ограничения смещается (см. скрин 2), при чем чем больше угол и чем больше итем, тем смещение больше.

Жду любой помощи. Спасибо

Скрин 2
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 23.4.2012, 11:28
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Наверное намудрил с транформами... оказалось все проще как всегда:

    if( m_enableClipping )
    {
        QPolygonF sRect = mapFromScene(scene()->sceneRect());
      
        QPainterPath clipPath = QPainterPath();
        clipPath.addPolygon( sRect );

        painter->setClipPath( clipPath, Qt::IntersectClip );
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.11.2024, 2:52