Nano Hash - криптовалюты, майнинг, программирование

Перетащите из одного QListView в другой QListView.

Я хотел бы реализовать функцию перетаскивания из одного QListView в другой. Действие перетаскивания скопирует текст перетаскиваемого элемента в другой QListView. Я хочу, чтобы перетаскивание было однонаправленным, я имею в виду только от QListView A до QListView B, но не наоборот. Для этого я получил два класса от QListView, один для перетаскиваемого представления и один для опускаемого. К сожалению, это не удается, я не могу перетаскивать свой элемент. Вот код, который я мог получить до сих пор:

import sys

from PyQt5.QtWidgets import QListView, QApplication

from PyQt5.QtGui import QStandardItemModel, QStandardItem

from PyQt5 import QtCore


class DraggableListView(QListView):

    def __init__(self, parent):
        super().__init__(parent)

        self.setDragEnabled(True)

    def flags(self, index):

        flags = super(DraggableListView, self).flags(index)

        if index.isValid():
            return flags | QtCore.Qt.ItemIsDragEnabled


class DroppableListView(QListView):

    def __init__(self, parent):
        super().__init__(parent)

        self.setDefaultDropAction(QtCore.Qt.CopyAction)
        self.setAcceptDrops(True)
        self.setDropIndicatorShown(True)

    def dragMovEvent(self, e):
        e.accept()

    def dragEnterEvent(self, e):

        if e.mimeData().hasFormat('text/plain'):
            e.accept()
        else:
            e.ignore()

    def dropEvent(self, e):

        item = QStandardItem(e.mimeData().text())
        self.model().appendRow(item)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        draggable_list_view = DraggableListView(self)
        draggable_list_view.setDragEnabled(True)
        draggable_list_view.move(30, 65)
        model1 = QStandardItemModel()
        draggable_list_view.setModel(model1)
        for it in ['yo', 'yi', 'ya']:
            item = QStandardItem(it)
            model1.appendRow(item)

        droppable_list_view = DroppableListView(self)
        droppable_list_view.move(190, 65)
        model2 = QStandardItemModel()
        droppable_list_view.setModel(model2)

        self.setGeometry(300, 300, 300, 150)


def main():

    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec_()


if __name__ == '__main__':
    main()

У вас есть идея/подсказка, как заставить его работать?

17.06.2020

Ответы:


1

нет необходимости переопределять какой-либо метод QListView, поскольку необходимо только включить флаги:

import sys

from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QListView, QApplication, QWidget, QHBoxLayout


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        draggable_list_view = QListView()
        draggable_list_view.setDragEnabled(True)
        model1 = QStandardItemModel()
        draggable_list_view.setModel(model1)
        for it in ["yo", "yi", "ya"]:
            item = QStandardItem(it)
            model1.appendRow(item)

        droppable_list_view = QListView()
        droppable_list_view.setAcceptDrops(True)
        droppable_list_view.setDropIndicatorShown(True)
        model2 = QStandardItemModel()
        droppable_list_view.setModel(model2)

        lay = QHBoxLayout(self)
        lay.addWidget(draggable_list_view)
        lay.addWidget(droppable_list_view)

        self.setGeometry(300, 300, 300, 150)


def main():

    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec_()


if __name__ == "__main__":
    main()

Примечание. При перетаскивании элемента из любой модели используется не MIME-тип "text/plain", а пользовательский MIME-тип "application/x-qabstractitemmodeldatalist".

17.06.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..