Перетащите из одного QListView в другой QListView - PullRequest
2 голосов
/ 17 июня 2020

Я хотел бы реализовать функцию перетаскивания с одного 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()

Есть ли у вас какие-нибудь идеи / подсказки, как заставить его работать?

1 Ответ

2 голосов
/ 17 июня 2020

нет необходимости переопределять какой-либо метод 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()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...