crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QAbstractItemModel и Drag and Drop
poluna
  опции профиля:
сообщение 23.12.2015, 14:00
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.10.2015
Пользователь №: 4458

Спасибо сказали: 1 раз(а)




Репутация:   0  


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

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

Все сделано по документации: Использование Drag and Drop с представлениями элементов
У обоих деревьев есть:
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.

Сообщение отредактировал poluna - 23.12.2015, 14:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 24.12.2015, 9:19
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Посмотрите исходники:
https://github.com/qtproject/qtbase/blob/de...mview.cpp#L1995
https://github.com/qtproject/qtbase/blob/de...emview_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

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

Сообщение отредактировал lanz - 24.12.2015, 9:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
poluna
  опции профиля:
сообщение 25.12.2015, 15:03
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.10.2015
Пользователь №: 4458

Спасибо сказали: 1 раз(а)




Репутация:   0  


Есть эти флаги, пришлось перейти на QStandardItemModel, там такой проблемы нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 25.12.2015, 15:33
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


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

Чтото вы меня дурите:
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.

Сообщение отредактировал lanz - 25.12.2015, 15:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
poluna
  опции профиля:
сообщение 28.12.2015, 10:15
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.10.2015
Пользователь №: 4458

Спасибо сказали: 1 раз(а)




Репутация:   0  


Кажется я поняла, что нужно сделать, попробую.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.10.2020, 8:23