Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Технология Drag and Drop для двух списков (QListWidget)
О сколько нам открытий чудных готовит ещё PyQt5? Ну есть ещё в запасниках кое-что. Да, я технологию "drag and drop" всегда не очень жаловал. Ну это чисто мои заморочки, связанные с тем с чего я когда-то начинал путь в программировании.
И так, что такое "drag and drop"? Это способ перетаскивания элементов в окне с одного места в другое или в более простых случаях из одного контейнера в другой. Сам процесс перетаскивания следующий: 1. Переводим курсор мыши на нужный элемент. 2. Фиксируем захват правой кнопкой мыши. 3. Тащим в нужное место. 4. Отпускаем кнопку мыши - "роняем" элемент. Замечу, что механизм этот можно реализовать самому (ручкам) и в одной из следующих статей я это продемонстрирую. Но сегодня просто воспользуемся возможностями библиотеки PyQt5.
Наша задача проста. В окне есть два списка, нужно реализовать перетаскивание элементов из одного в списка в другой и обратно (см. Рисунок и Рисунок 2).
Но прежде всего вспомним статьи, в которых я описывал работу со списками (QListWidget). Это статьи 1 и 2. Познакомьтесь с ними, если забыли материал.
Программа, представленная ниже, реализует следующую функциональность:
- возможность перетаскивания элементов между списками;
- при перетаскивании элемент перемещается в другой список и удаляется из первого;
- возможность перетаскивать внутри списка.
Пояснение к программе
- В программе реализованы списки с пиктограммами и подписями к ним (QListWidget.IconMode).
- Ранее мы уже разбирали использование пиктограмм с списках. В начале создаются объекты: QtGui.QIcon(p1), где p1 - имя изображения на диске. Потом создаётся объект "Элемент списка" - QListWidgetItem(). Потом элемент добавляется в список: QListWidget.addItem().
- Для каждого списка указывается: QListWidget.setAcceptDrops(True) и QListWidget.setDragEnabled(True). Т.е. каждый из каждого списка можно перетаскивать элемент и в каждый список можно "ронять" элемент.
- Разрешено перетаскивать внутри списков QListWidget.InternalMove и перетаскивание между списками QAbstractItemView.DragDrop.
- При перетаскивании в другой список элемент из списка удаляется.
Пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.