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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Пара вопросов по QGraphicsItem  (Прочитано 4359 раз)
White Owl
Гость
« : Май 15, 2010, 00:37 »

1) Есть наследник от QGraphicsPixmapItem который можно таскать по сцене, то есть в конструкторе задано: setFlag(QGraphicsItem::ItemIsMovable, true);

Перегружен метод itemChange():
Код:
QVariant MyItem::itemChange(GraphicsItemChange change, const QVariant &value) {
qDebug() << "change =" << change;
if (change == QGraphicsItem::ItemPositionChange) {
                   // сюда я никогда не попадаю
}
return QGraphicsItem::itemChange(change, value);
}
В выводе вижу
change = ItemSelectedChange
change = ItemSelectedHasChanged
change = ItemSelectedChange
change = ItemSelectedHasChanged
change = ItemSelectedChange
change = ItemSelectedHasChanged

Не понимаю, почему ItemPositionChange никогда не случается? Объект по окну таскается превосходно...

2) Когда я таскаю по сцене ранее созданный объект, он "заезжает" под объекты созданные позже. Хочу вытаскивать активный объект на самый верх. Можно конечно самостоятельно играться с zValue()/setZValue(), но может есть более простой способ для этого?


Qt 4.6.2
Записан
jack_r
Гость
« Ответ #1 : Май 15, 2010, 17:25 »

Цитировать
QGraphicsItem::ItemSendsGeometryChanges - The item enables itemChange() notifications for ItemPositionChange, ItemPositionHasChanged, ItemMatrixChange, ItemTransformChange, and ItemTransformHasChanged. For performance reasons, these notifications are disabled by default. You must enable this flag to receive notifications for position and transform changes. This flag was introduced in Qt 4.6.

Цитировать
2) Когда я таскаю по сцене ранее созданный объект, он "заезжает" под объекты созданные позже. Хочу вытаскивать активный объект на самый верх. Можно конечно самостоятельно играться с zValue()/setZValue(), но может есть более простой способ для этого?
Если есть, мне тоже интересно его узнать. Я же делал выбор активного объекта через QStateMachine, что далеко нетривиально.
« Последнее редактирование: Май 15, 2010, 17:28 от jack_r » Записан
White Owl
Гость
« Ответ #2 : Май 17, 2010, 20:27 »

За  QGraphicsItem::ItemSendsGeometryChanges - спасибо.
Оказывается мой QtCreator каким-то странным образом подсовывает мне документацию от 4.5. Буду разбираться.

Про игру с ZOrder. У меня, проблема еще осложнается тем что у меня есть несколько типов объектов которые должны отрисовываться на разных слоях...
В итое добавил в обработчик itemChange() такой код:
Код:
	if(change == QGraphicsItem::ItemSelectedChange) {
int myOldZValue = zValue();
int countOfSameTypeItems = 0;
foreach(QGraphicsItem *item, scene()->items()) {
if(item->type()==type()) {
int itemOldZValue=item->zValue();
if(itemOldZValue > myOldZValue) item->setZValue(itemOldZValue-1);
countOfSameTypeItems++;
}
}
setZValue(countOfSameTypeItems);
}
Вроде работает как надо.
В минусах: пришлось еще дописать в процедуру добавления объектов на сцену установку уникального ZOrder для новых объектов. И выделить для каждого из типов по собственной "z-области" что, в принципе, ставит ограничение на количество объектов "в слое". Но это не такая уж большая беда если учесть что "слоев" у меня всего три а ZOrder считается как real Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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