如何让pyqt6的QListWidget支持拖拽
时间: 2024-05-15 10:17:32 浏览: 137
可以通过以下步骤实现QListWidget的拖拽功能:
1. 设置QListWidget的拖拽模式为QtWidgets.QAbstractItemView.DragDrop模式,可以在类的构造函数中使用setDragDropMode()函数实现。
2. 设置QListWidget中Item的拖拽行为,默认情况下QListWidgetItem是可以被拖拽并创建副本的,可以通过重载QListWidgetItem的mimeData()函数实现自定义拖拽数据。
3. 设置QListWidget的拖拽事件,可以使用dragEnterEvent()、dragLeaveEvent()、dragMoveEvent()和dropEvent()等函数实现。
下面是一个简单的例子,演示如何在pyqt6中实现QListWidget的拖拽功能:
``` python
from PyQt6 import QtCore, QtGui, QtWidgets
class MyListWidget(QtWidgets.QListWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
self.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection)
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
item = self.itemAt(event.pos())
if item and item.isSelected():
# 记录拖拽项的数据
mimeData = QtCore.QMimeData()
mimeData.setText(item.text())
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
drag.setHotSpot(event.pos() - item.pos())
# 开始拖拽操作
drag.exec_(QtCore.Qt.MoveAction)
def dragEnterEvent(self, event):
if event.mimeData().hasText():
event.acceptProposedAction()
def dragMoveEvent(self, event):
if event.mimeData().hasText():
event.acceptProposedAction()
def dropEvent(self, event):
if event.mimeData().hasText():
itemText = event.mimeData().text()
item = QtWidgets.QListWidgetItem(itemText, self)
item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled)
event.acceptProposedAction()
if __name__ == '__main__':
app = QtWidgets.QApplication([])
win = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout(win)
listWidget = MyListWidget(win)
listWidget.addItem('item1')
listWidget.addItem('item2')
listWidget.addItem('item3')
layout.addWidget(listWidget)
win.show()
app.exec_()
```
在上面的例子中,重载了MyListWidget类,通过重载mousePressEvent()函数记录待拖拽项的数据,然后在拖拽事件中实现了拖拽的各个操作。通过这些步骤,就可以实现QListWidget的拖拽功能了。
阅读全文