QListWidget拖拽 因QVariant数据原因报错
时间: 2024-05-07 18:20:35 浏览: 140
qlistWidget拖拽
4星 · 用户满意度95%
QListWidget支持拖拽操作,但是在实现拖拽时需要注意数据的类型。如果QListWidget中的数据类型与拖拽时使用的数据类型不同,就会出现QVariant数据的报错。
通常情况下,我们在QListWidget中存储的是QListWidgetItem对象,而在拖拽时需要使用的是QModelIndex对象。因此,我们需要在拖拽时将QListWidgetItem对象转换为QModelIndex对象,并使用QVariant进行传递。
以下是一个使用QVariant实现QListWidget拖拽的例子:
```python
from PyQt5.QtWidgets import QApplication, QListWidget, QListWidgetItem, QAbstractItemView
from PyQt5.QtGui import QDragEnterEvent, QDragLeaveEvent, QDragMoveEvent, QMouseEvent, QStandardItemModel
from PyQt5.QtCore import Qt, QMimeData
class DragListWidget(QListWidget):
def __init__(self):
super().__init__()
self.setAcceptDrops(True)
self.setSelectionMode(QAbstractItemView.ExtendedSelection)
def mousePressEvent(self, event: QMouseEvent) -> None:
if event.buttons() == Qt.LeftButton:
self.startDrag()
def startDrag(self):
selected_items = self.selectedItems()
if not selected_items:
return
mimeData = QMimeData()
encoded_data = bytearray()
for item in selected_items:
index = self.indexFromItem(item)
if index.isValid():
encoded_data += str(index.row()).encode()
mimeData.setData('application/x-qabstractitemmodeldatalist', encoded_data)
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
drag.exec_(Qt.MoveAction)
def dragEnterEvent(self, event: QDragEnterEvent) -> None:
event.accept()
def dragMoveEvent(self, event: QDragMoveEvent) -> None:
event.accept()
def dragLeaveEvent(self, event: QDragLeaveEvent) -> None:
event.accept()
def dropEvent(self, event: QtGui.QDropEvent) -> None:
mimeData = event.mimeData()
if not mimeData or not mimeData.hasFormat('application/x-qabstractitemmodeldatalist'):
return
encoded_data = mimeData.data('application/x-qabstractitemmodeldatalist')
stream = QDataStream(encoded_data, QIODevice.ReadOnly)
items = []
while not stream.atEnd():
row, col, parent_row, parent_col = (None,) * 4
stream >> row >> col >> parent_row >> parent_col
index = self.model().index(row, col, QModelIndex())
if not index.isValid():
continue
item = self.model().itemFromIndex(index)
if item:
items.append(item)
if not items:
return
event.setDropAction(Qt.MoveAction)
event.accept()
for item in items:
self.takeItem(self.row(item))
self.addItem(item.text())
```
在这个例子中,我们重写了QListWidget的mousePressEvent函数,在左键点击时调用startDrag函数。在startDrag函数中,我们将选中的QListWidgetItem对象转换为QModelIndex对象,并使用QMimeData进行传递。在拖拽时,我们将数据的格式设置为'application/x-qabstractitemmodeldatalist',并使用QDataStream将数据转换为字节流进行传递。
在dropEvent函数中,我们将拖拽的数据转换为QModelIndex对象,并根据需要进行处理。在这个例子中,我们将拖拽的QListWidgetItem对象添加到新的位置。
希望这个例子可以帮助你解决QVariant数据报错的问题。
阅读全文