PyQt6 - QListView - 拖放错误?

问题描述 投票:0回答:1

我目前遇到的问题是我的 QListView 导致非常奇怪的行为:

  • 我申请一个模型
  • 我将dragDropMode设置为InternalMove

我可以拖放,但是当我将项目放在另一个项目上而不是上方/下方/之间时,该项目就会消失。这是一个错误吗?我找到了一些与此相关的信息,但没有任何帮助。目前我的一个解决方法是实现一个自定义 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。没有变化

非常感谢任何帮助

python pyqt5 pyqt6
1个回答
0
投票

非常感谢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

虽然这可以防止物品掉落和随后的覆盖,但它也可以防止物品的内部移动。所以它并不能解决我的问题。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.