我目前遇到的问题是我的 QListView 导致非常奇怪的行为:
我可以拖放,但是当我将项目放在另一个项目上而不是上方/下方/之间时,该项目就会消失。这是一个错误吗?我找到了一些与此相关的信息,但没有任何帮助。目前我的一个解决方法是实现一个自定义 QListView 并确定放置是否在某个项目上,在这种情况下,不要将事件路由到父类... t:
model = CustomListModel(["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"])
self.list_view.setModel(model)
self.list_view.setDragDropMode(QListView.DragDropMode.InternalMove)
我尝试降级到早期的 pyqt5 版本以及升级到 pyqt6。没有变化
非常感谢任何帮助
非常感谢musicamante,我昨天尝试了几个小时,但非常令人沮丧。解决方案就是这么简单。检查我们是否有有效的索引(=放置在一个项目上),然后不允许,否则允许。太棒了!
class CustomListModel(QStandardItemModel):
def __init__(self, elements: List[str] = None):
super().__init__()
def flags(self, index):
if index.isValid():
# Remove the Qt.ItemIsDropEnabled flag to prevent dropping on an item
return super().flags(index) & ~Qt.ItemFlag.ItemIsDropEnabled
return super().flags(index) | Qt.ItemFlag.ItemIsDropEnabled
编辑 替代解决方案也有效,谢谢!在 CustomListModel(QStandardItemModel) 中:
def add_element(self, element: str, sort: bool = False):
item = QStandardItem(element)
item.setEditable(False)
item.setDropEnabled(False)
self.appendRow(item)
旧答案 musicamante 的建议是通过将 Qt.ItemFlag.ItemIsDropEnabled 设置为 false 来覆盖默认行为,即放置在项目上会覆盖它们:
class CustomListModel(QStandardItemModel):
def __init__(self, elements: List[str] = None):
super().__init__()
def flags(self, index):
return super().flags(index) & ~Qt.ItemFlag.ItemIsDropEnabled
虽然这可以防止物品掉落和随后的覆盖,但它也可以防止物品的内部移动。所以它并不能解决我的问题。