def _filter_drag_move(self, event): QAbstractItemView.dragMoveEvent(self.filterTreeWidget, event) source = self.filterTreeWidget.currentItem() target = self.filterTreeWidget.itemAt(event.pos()) if not target: event.ignore() return source_top = source.parent() if source_top.parent(): source_top = source_top.parent() target_top = target if target_top.parent(): target_top = target_top.parent() if target_top.parent(): target_top = target_top.parent() # Drag and Drop is only allowed for the same filter type if source_top != target_top: event.ignore() return # Groups can only be dragged to top level if source.data(1, Qt.UserRole) == self.FilterTreeRoleGroup: if target.data(1, Qt.UserRole) == \ self.FilterTreeRoleGroup: event.ignore() return if target.parent() != target_top and target != target_top: event.ignore() return # This strange hack prevents from dragging to root level if source_top == target: pos = event.pos() pos.setY(pos.y() - 2) higher_target = self.filterTreeWidget.itemAt(pos) if target != higher_target: event.ignore()