У меня время раздражает, пытаясь обойти «рекомендованный» способ сделать что-то.QGraphicsItem: Почему нет метода `stackAfter`?
Итак, у меня есть стопка карточек. Я хочу сделать так, чтобы при работе с картой он стал последним нарисованным объектом всей сцены (типичная функциональность bring_to_front
).
Рекомендуемый способ сделать это - просто добавить к объекту zValue
, пока он не станет больше, чем все остальные, но я надеялся покончить с довольно «ленивыми» целыми числами, работающими повсюду, с разумным использованием stackBefore
, который имитирует реорганизацию порядка, в котором объекты были добавлены в сцену.
Это прекрасно работает, когда я перетасовываю свои карты в ограниченном наборе (получаю список выбранных предметов, random.shuffle, для элемента item.stackBefore (следующий элемент)), но он, безусловно, не работает, когда дело доходит до пузырящая карту до вершины всей сцены.
Я считал, добавив копию объекта на сцене, а затем удаляет оригинал, но это только кажется, что я должен быть в состоянии сделать stackAfter
, как я бы при использовании списка Python (или insertAt
или что-то).
Пример кода:
def deal_items(self):
if not self.selection_is_stack():
self.statusBar().showMessage("You must deal from a stack")
return
item_list = self.scene.sorted_selection()
for i,item in enumerate(item_list[::-1]):
width = item.boundingRect().width()
item.moveBy(width+i*width*0.6,0)
another_list = self.scene.items()[::-1]
idx = another_list.index(item)
for another_item in another_list[idx+1:]:
another_item.stackBefore(item)
Это работает. Это просто кажется ... уродливым.
может быть, есть трюк, как 'setZValue = 0' автоматически помещает объект в конце всех объектов с Zvalue == 0? я не знаю, – RodericDay