Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ QAbstractItemModel и Drag and Drop

Автор: poluna 23.12.2015, 14:00

Привет всем.
Снова я к вам со своими проблемами. :)

Есть два QTreeView, они используют модель производную от QAbstractItemModel.
Проблема в том, что при перетаскивании item'а из одного дерева в другое, появляется разрешающая иконка только в том случае, если этот item навести непосредственно на другой item в дереве.
Если item будет над самим QTreeView, то иконка будет запрещающей.

Все сделано по документации: http://www.doc.crossplatform.ru/qt/4.3.2/model-view-dnd.html
У обоих деревьев есть:

self._groupList = QtGui.QTreeView()
self._groupList.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self._groupList.setDragEnabled(True)
self._groupList.setAcceptDrops(True)
self._groupList.setDropIndicatorShown(True)
В модели переопределены:
def flags(self, index):
        if index.isValid():
            defaultFlags=QtCore.QAbstractItemModel.flags(self, index)
            return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | defaultFlags
        return None

def supportedDropActions(self):
        return QtCore.Qt.CopyAction | QtCore.Qt.MoveAction


В чем может быть проблема ума не приложу! :(
Должна быть возможность бросать item непосредственно в само окно QTreeView, без наведения на другой item.

Автор: lanz 24.12.2015, 9:19

Посмотрите исходники:
https://github.com/qtproject/qtbase/blob/dev/src/widgets/itemviews/qabstractitemview.cpp#L1995
https://github.com/qtproject/qtbase/blob/dev/src/widgets/itemviews/qabstractitemview_p.h#L308

В вашем случае rootIndex это невалидный индекс, а ваша модель не врозвращает для невалидных индексов никаких флагов:

def flags(self, index):
        if index.isValid():
            defaultFlags=QtCore.QAbstractItemModel.flags(self, index)
            return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | defaultFlags
        return None

Вам нужно возвращать правильные флаги для невалидного индекса (и обрабатывать дроп на невалидный индекс).

Автор: poluna 25.12.2015, 15:03

Есть эти флаги, пришлось перейти на QStandardItemModel, там такой проблемы нет.

Автор: lanz 25.12.2015, 15:33

Цитата
Есть эти флаги

Чтото вы меня дурите:
def flags(self, index):
        if index.isValid():
            defaultFlags=QtCore.QAbstractItemModel.flags(self, index)
            return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | defaultFlags
        return None

Если индекс невалидный(root), код выше вернет None.

Автор: poluna 28.12.2015, 10:15

Кажется я поняла, что нужно сделать, попробую.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)