У меня есть QListWidget и QTreeWidget, и я хочу иметь возможность перетаскивать один или несколько элементов списка как внутри, так и между ними.У меня есть внутреннее перетаскивание, но я не знаю, как перетаскивать их между собой.
Когда я печатаю event.mimeData().formats()
в моем коде ниже, он говорит: ['application/x-qabstractitemmodeldatalist']
.Я застрял на том, как извлечь текст и индекс этого элемента (это должен быть QListWidgetItem или QTreeWidgetItem, верно?), Поэтому я могу удалить оригинал из исходного виджета и добавить новый элемент в целевой виджет, как мне это сделать?что?
Я пытался использовать код отсюда:
https://wiki.python.org/moin/PyQt/Handling%20Qt%27s%20internal%20item%20MIME%20type
Так что в настоящее время мой код получает элементы QVariant, когда я перетаскиваю элементы между виджетами, но я все еще не знаючто делать с ними, чтобы получить текст элемента и индекс.
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QTreeWidgetItem
import sys
class Tree(QtWidgets.QTreeWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setDragDropMode(self.DragDrop)
self.setSelectionMode(self.ExtendedSelection)
self.setAcceptDrops(True)
for text in ['tree1','tree2','tree3']:
treeItem = QtWidgets.QTreeWidgetItem(self, [text])
treeItem.setFlags(treeItem.flags() & ~QtCore.Qt.ItemIsDropEnabled)
self.addTopLevelItem(treeItem)
def dropEvent(self, event):
if event.source() == self:
event.setDropAction(Qt.MoveAction)
QtWidgets.QTreeWidget.dropEvent(self, event)
else:
bytearray = event.mimeData().data('application/x-qabstractitemmodeldatalist')
data_items = decode_data(bytearray)
for item in data_items:
print(item)
# What do I do with this?
class List(QtWidgets.QListWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setDragDropMode(self.DragDrop)
self.setSelectionMode(self.ExtendedSelection)
self.setAcceptDrops(True)
for text in ['list1','list2','list3']:
self.addItem(text)
def dropEvent(self, event):
if event.source() == self:
event.setDropAction(Qt.MoveAction)
QtWidgets.QListWidget.dropEvent(self, event)
else:
bytearray = event.mimeData().data('application/x-qabstractitemmodeldatalist')
data_items = decode_data(bytearray)
for item in data_items:
print(item)
# What do I do with this?
def decode_data(bytearray):
data = []
item = {}
ds = QtCore.QDataStream(bytearray)
while not ds.atEnd():
row = ds.readInt32()
column = ds.readInt32()
map_items = ds.readInt32()
for i in range(map_items):
key = ds.readInt32()
value = QtCore.QVariant()
ds >> value
item[Qt.ItemDataRole(key)] = value
data.append(item)
return data
if __name__=='__main__':
app = QtWidgets.QApplication(sys.argv)
layout = QtWidgets.QHBoxLayout()
layout.addWidget(Tree())
layout.addWidget(List())
container = QtWidgets.QWidget()
container.setLayout(layout)
container.show()
app.exec_()