控制QListWidget只在内部做拖拽
时间: 2024-05-05 17:21:36 浏览: 75
要实现 QListWidget 只在内部进行拖拽操作,可以通过继承 QListWidget 并重写其 mousePressEvent()、mouseMoveEvent() 和 dropEvent() 方法来实现。
具体实现步骤如下:
1. 重写 mousePressEvent() 方法,在该方法中记录鼠标按下的位置和当前选中的项。
2. 重写 mouseMoveEvent() 方法,在该方法中判断鼠标移动的距离,如果移动距离超过一定阈值,则开始拖拽操作。
3. 在拖拽操作开始时,调用 QListWidget 的 startDrag() 方法,并设置 QMimeData 对象来传输拖拽数据。
4. 重写 dropEvent() 方法,处理拖拽数据并进行相应的操作。
下面是一个示例代码:
```python
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDrag
from PyQt5.QtWidgets import QListWidget, QAbstractItemView
class MyListWidget(QListWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setDragEnabled(True)
self.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.start_pos = None
self.selected_items = None
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.start_pos = event.pos()
self.selected_items = self.selectedItems()
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton:
if not self.start_pos:
return
if (event.pos() - self.start_pos).manhattanLength() < QApplication.startDragDistance():
return
drag = QDrag(self)
mime_data = QMimeData()
mime_data.setData('application/x-qabstractitemmodeldatalist', self.model().mimeData(self.selected_items))
drag.setMimeData(mime_data)
if drag.exec_(Qt.MoveAction) == Qt.MoveAction:
for item in self.selected_items:
self.takeItem(self.row(item))
self.start_pos = None
self.selected_items = None
super().mouseMoveEvent(event)
def dropEvent(self, event):
if event.source() == self:
super().dropEvent(event)
else:
event.ignore()
```
在这个示例中,我们重写了 mousePressEvent() 方法来记录鼠标按下的位置和当前选中的项,重写了 mouseMoveEvent() 方法来判断鼠标移动的距离,如果移动距离超过一定阈值,则开始拖拽操作,并在 dropEvent() 方法中处理拖拽数据和相应的操作。同时,我们还设置了 QListWidget 的 setDragEnabled() 方法来启用拖拽操作,并设置了 setSelectionMode() 方法来设置选择模式为多选。
阅读全文