QListWidgetItem怎么能不在其他控件上拖放?
时间: 2024-05-10 18:17:11 浏览: 78
要实现QListWidgetItem不在其他控件上拖放,可以通过重写QListWidgetItem中的mimeData函数来实现。具体步骤如下:
1. 继承QListWidgetItem,重写mimeData函数,返回一个空的QMimeData对象。
```python
class MyListWidgetItem(QListWidgetItem):
def mimeData(self, *args, **kwargs):
return QMimeData()
```
2. 在拖放开始时,判断当前拖放的项是否为MyListWidgetItem类型的,是则启用拖放,否则禁用拖放。
```python
class MyListWidget(QListWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'):
item = self.itemAt(event.pos())
if isinstance(item, MyListWidgetItem):
event.accept()
return
event.ignore()
def dragMoveEvent(self, event):
if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'):
item = self.itemAt(event.pos())
if isinstance(item, MyListWidgetItem):
event.setDropAction(Qt.MoveAction)
event.accept()
return
event.ignore()
def dropEvent(self, event):
if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'):
item = self.itemAt(event.pos())
if isinstance(item, MyListWidgetItem):
data = event.mimeData().data('application/x-qabstractitemmodeldatalist')
stream = QDataStream(data, QIODevice.ReadOnly)
rows = []
while not stream.atEnd():
row, col, _ = stream.readInt32(), stream.readInt32(), stream.readInt32()
rows.append(row)
rows = sorted(set(rows))
for row in reversed(rows):
self.takeItem(row)
event.setDropAction(Qt.MoveAction)
event.accept()
return
event.ignore()
```
这样就可以实现QListWidgetItem不在其他控件上拖放的效果了。
阅读全文