LINUX.ORG.RU

Qt QGraphicsitem::itemChange()

 ,


0

1

Здравствуйте, уважаемые формчане. Извините за нубские вопросы, но я совсем запутался. Наследую от QGraphicsItem свой класс. Мне нужно, чтобы при выделении производились какие-то действия. В дальнейшем планирую наследовать дополнительно от QObject и посылать сигналы при изменении. Пробую простейшие действия:

QVariant MovingObject::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if (change == ItemPositionChange)
    {
        // value это новое положение.
        QPointF newPos = value.toPointF();
        newPos.setX(x()); // ограничиваем по Х
        QRectF rect = scene()->sceneRect();
        if (!rect.contains(newPos))
        {
             // Сохраняем элемент внутри прямоугольника сцены.
             newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
             newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
        }
        return newPos;
    }

    return QGraphicsItem::itemChange(change, value);
}
На что компилятор ругнулся : ((MovingObject*)this)->MovingObject::x' cannot be used as a function Ладно, не критично пока, подумал я и заменил x() на число. Далее программа скомпилировалась, но ничего не произошло. Я попытался вывести в отладку значение change: ItemFlagsChange

ItemFlagsHaveChanged

ItemFlagsChange

ItemFlagsHaveChanged

ItemSceneChange

ItemSceneHasChanged

ItemVisibleChange

ItemVisibleHasChanged

ItemSelectedChange

ItemSelectedHasChanged

Т.е. я перемещаю объект, а он не отлавливает ItemPositionChange. В конструкторе я прописал:

    setAcceptHoverEvents(true);
    setAcceptDrops(true);;
        setFlag(QGraphicsItem::ItemIsMovable);
        setFlag(QGraphicsItem::ItemIsSelectable);
Подскажите пожалуйста, где я ошибаюсь :(



Последнее исправление: gwyllum (всего исправлений: 1)

    setFlags( QGraphicsItem::ItemIsMovable
              | QGraphicsItem::ItemIsSelectable
              | QGraphicsItem::ItemIsFocusable
              | QGraphicsItem::ItemSendsGeometryChanges
              );

Последний флаг нужен.

grondek
()
Ответ на: комментарий от grondek

Огромное спасибо! Все заработало))

gwyllum
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.