Как я отвечаю на внутреннюю операцию перетаскивания с помощью QListWidget?

Ну, не действительно, но это зависит от Вашей архитектуры.

if (dosomething()) { ; }

Вышеупомянутое собирается постоянно продвинуть и появиться от Вашего локального стека, который имеет память наверху. Кроме того, Вы будете также сбрасывать конвейеры своих процессоров с noop операциями.

8
задан Chris B. 3 August 2009 в 09:26
поделиться

2 ответа

Мне просто пришлось с этим разобраться, и это головная боль, но вот что делать:

Вы должны установить 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

Если у вас есть другие класс, содержащий этот список, вы можете переместить туда метод фильтрации событий. Надеюсь, это поможет, я знаю, что мне пришлось бороться с этим в течение дня, прежде чем это выяснить.

7
ответ дан 3 November 2019 в 14:03
поделиться

Не решение, но некоторые идеи:

Вероятно, вам следует проверить, что возвращает метод supportedDropActions. Возможно, вам потребуется перезаписать этот метод, чтобы включить Qt :: MoveAction или Qt :: CopyAction.

У вас есть сигнал QListView :: indexesMoved, но я не уверен, будет ли он сгенерирован, если вы используете QListWidget . Стоит проверить.

1
ответ дан 3 November 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: