Ну, не действительно, но это зависит от Вашей архитектуры.
if (dosomething()) { ; }
Вышеупомянутое собирается постоянно продвинуть и появиться от Вашего локального стека, который имеет память наверху. Кроме того, Вы будете также сбрасывать конвейеры своих процессоров с noop операциями.
Мне просто пришлось с этим разобраться, и это головная боль, но вот что делать:
Вы должны установить eventFilter
на свой ListWidget
подкласс, а затем следите за событием ChildRemoved
. Это событие охватывает перемещения, а также удаление, поэтому оно должно работать для переупорядочения элементов с помощью перетаскивания внутри списка.
Я пишу свой Qt на C ++, но вот версия с питонизацией:
class MyList(QtGui.QListWidget):
def __init__(self):
QtGui.QListWidget.__init__(self)
self.setDragDropMode(self.InternalMove)
self.installEventFilter(self)
def eventFilter(self, sender, event):
if (event.type() == QEvent.ChildRemoved):
self.on_order_changed()
return False # don't actually interrupt anything
def on_order_changed(self):
# do magic things with our new-found knowledge
Если у вас есть другие класс, содержащий этот список, вы можете переместить туда метод фильтрации событий. Надеюсь, это поможет, я знаю, что мне пришлось бороться с этим в течение дня, прежде чем это выяснить.
Не решение, но некоторые идеи:
Вероятно, вам следует проверить, что возвращает метод supportedDropActions. Возможно, вам потребуется перезаписать этот метод, чтобы включить Qt :: MoveAction или Qt :: CopyAction.
У вас есть сигнал QListView :: indexesMoved, но я не уверен, будет ли он сгенерирован, если вы используете QListWidget . Стоит проверить.