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