2012-04-20 4 views
1

Мне нужно использовать QAbstractItemModel с QTreeView в PyQt.Как использовать QAbstractItemModel?

В методе dropMimeData я хочу удалить исходную строку (если это некий MIME_TYPE.) Как получить строку и parentIndex источника? Или мне нужно сделать это с помощью другого метода.

def dropMimeData(self, mimedata, action, row, column, parentIndex):

+0

Вы не определили, что QTreeWidget не хватит? Как насчет QTreeView + QStandardItemModel? Что вам нужно, что требует от вас подкласса и создания вашей собственной модели? – jdi

+0

@ Тит: Я думаю, что вы редактируете, а да, это указывает на ясность вопроса, значительно меняет то, что может спросить OP. Возможно, было бы лучше, если бы вы сделали комментарий и позволили OP настроить этот треск. Меня больше интересовало, почему ему нужна абстрактная модель, а не его вопрос о dropMimeData, который, по моему мнению, может быть неактуальным. – jdi

+0

@jdi Я ничего не определил. Я начал с самой близкой вещи, которую мог найти, которая казалась близкой к тому, что мне нужно. Мне нужно одно дерево исходных элементов (один столбец имен на данный момент) и другое дерево, на которое я хочу удалить те itmes. На целевом дереве мне нужно переместить элементы в другое место. Я предполагаю, что это будет внутреннее перетаскивание, а затем удалить исходный элемент. Я использовал подклассифицированные модели только для того, чтобы указать, с каким деревом элементы поступают, поэтому я бы не удалял их из исходного дерева. – hosscomp

ответ

3

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

QAbstractItemModel - это базовый класс, который существует, когда вам нужен индивидуальный способ моделирования ваших данных, которые не соответствуют одному из существующих, например, где источник данных и как представлять их как элементы. Он не готов к использованию из коробки, так как он должен реализовывать ряд методов. Вероятно, вам не следует начинать с этого класса, если у вас нет веских оснований для этого, поскольку для работы и работы требуется гораздо больше работы.

Для простоты перетаскивания и использования основных элементов QStandardItemModel должен быть готов к использованию. Вы просто создаете QStandardItems и заполняете модель. Для перетаскивания вы должны подклассифицировать модель и просто реализовать соответствующие методы * Event and drop * Event для ваших нужд.

Использование QStandardItemModel + QTreeView позволяет вам иметь несколько видов просмотра, используя одну и ту же модель, и одновременно визуализировать ее. Но, учитывая, что вы сказали, что хотите сохранить два разных набора независимых данных, и что вы новичок в Qt, я бы настоятельно рекомендовал вам использовать два QTreeWidgets. QTreeWidget - это всеобъемлющий пакет представления и модели. Это будет намного проще для вас использовать сейчас.

Используя QTreeWidget, вы должны подклассифицировать их и реализовать необходимые события перетаскивания так же, как и для QTreeView, но вам больше не придется беспокоиться о моделях отдельно.

Вот ссылка на пост о перетаскивании с QTreeWidget: http://www.qtcentre.org/threads/5910-QTreeWidget-Drag-and-drop
Они упоминают рекомендуемые методы для реализации, а также то, что вы должны делать с подклассом QTreeWidgetItem для определения mimeData.

+0

«Вы всегда можете переопределить QWidget :: mousePressEvent (QMouseEvent *) и создать свой собственный объект QDrag, определяющий тип перетаскивания (перемещение или копирование) вручную». Это похоже на то, что мне нужно было знать. Мой первоначальный вопрос заключался в том, где я хочу получить базовое представление об этих классах и о том, как их использовать. Для PyQt похоже, что единственное место - это ссылки на классы и онлайн-примеры (в основном на C++) и размещение множества вопросов. Кажется, у меня не было проблем с поиском хороших книг и учебников для Java. Спасибо за вашу помощь. – hosscomp

+0

@hosscomp: Документы для C++ API почти одинаковы для python, кроме синтаксиса. Хорошая книга: http://www.qtrac.eu/pyqtbook.html. Это просто вопрос чтения документации на C++, которая довольно много. У них есть целая секция по перетаскиванию – jdi

+0

Спасибо. Я думаю, что книга будет очень полезной для меня. Я только сегодня обнаружил, как добавить обработчик dragEnterEvent в TreeView и проверить, является ли event.source() самостоятельным. – hosscomp

Смежные вопросы