如何修改QListView中的drop事件
How to modify drop event in QListView
我有一个 QListView
,通过将 dragDropMode 设置为 DragDrop 并将 defaultDropAction 设置为 MoveAction,可以通过拖放对项目进行重新排序。我怎样才能拦截 drop 事件,找出试图移动的内容相对于列表其余部分的位置,以便我可以在特定条件下取消此操作?例如。我想禁止将某些项目移到其他项目后面。
您可以根据您的条件访问dropEvent
和setDropAction到Qt.IgnoreAction
中涉及的索引和项目来取消drop。由于您没有具体说明,对于本次演示,我只创建了一个位于底部的项目。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class List(QListView):
def dropEvent(self, event):
i = self.selectedIndexes()[0]
j = self.indexAt(event.pos())
# To access the items involved
source = self.model().itemFromIndex(i)
target = self.model().itemFromIndex(j)
bottom = (self.model().rowCount() - 1, -1)
if i.row() in bottom or j.row() in bottom:
event.setDropAction(Qt.IgnoreAction)
else:
super().dropEvent(event)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QWidget()
lv = List()
lv.setDragDropMode(QAbstractItemView.DragDrop)
lv.setDefaultDropAction(Qt.MoveAction)
model = QStandardItemModel(5, 1)
for i in range(4):
item = QStandardItem(f'Item {i + 1}')
item.setFlags(item.flags() & ~Qt.ItemIsDropEnabled)
model.setItem(i, 0, item)
item = QStandardItem('I stay at the bottom ._.')
model.setItem(4, 0, item)
lv.setModel(model)
vbox = QVBoxLayout(window)
vbox.addWidget(lv)
window.show()
sys.exit(app.exec_())
我有一个 QListView
,通过将 dragDropMode 设置为 DragDrop 并将 defaultDropAction 设置为 MoveAction,可以通过拖放对项目进行重新排序。我怎样才能拦截 drop 事件,找出试图移动的内容相对于列表其余部分的位置,以便我可以在特定条件下取消此操作?例如。我想禁止将某些项目移到其他项目后面。
您可以根据您的条件访问dropEvent
和setDropAction到Qt.IgnoreAction
中涉及的索引和项目来取消drop。由于您没有具体说明,对于本次演示,我只创建了一个位于底部的项目。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class List(QListView):
def dropEvent(self, event):
i = self.selectedIndexes()[0]
j = self.indexAt(event.pos())
# To access the items involved
source = self.model().itemFromIndex(i)
target = self.model().itemFromIndex(j)
bottom = (self.model().rowCount() - 1, -1)
if i.row() in bottom or j.row() in bottom:
event.setDropAction(Qt.IgnoreAction)
else:
super().dropEvent(event)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QWidget()
lv = List()
lv.setDragDropMode(QAbstractItemView.DragDrop)
lv.setDefaultDropAction(Qt.MoveAction)
model = QStandardItemModel(5, 1)
for i in range(4):
item = QStandardItem(f'Item {i + 1}')
item.setFlags(item.flags() & ~Qt.ItemIsDropEnabled)
model.setItem(i, 0, item)
item = QStandardItem('I stay at the bottom ._.')
model.setItem(4, 0, item)
lv.setModel(model)
vbox = QVBoxLayout(window)
vbox.addWidget(lv)
window.show()
sys.exit(app.exec_())