【问题标题】:QTreeView - Wait until the drop is complete to perform another action [closed]QTreeView - 等到放置完成以执行另一个操作[关闭]
【发布时间】:2020-08-27 22:00:16
【问题描述】:

我正在使用带有 MyTreeModel(继承自 QAbstractItemModel)的 TreeView。该模型由文档中出现的带有节点的树结构提供。

我已经完美地实现了树元素之间拖放的整个主题。正如文档所说的那样,我为它重新实现了 mimeData、mimeTypes 和 dropMimeData。

视频: https://mega.nz/#!bkoTDQSI!YgVn6jIAPJ86fhexzsGySbhrPwQAK5IwlTTeb5L-sQ4

问题是我想在与被丢弃的项目相关的丢弃后立即以编程方式执行操作。

我想在drop后展开item,我想选择它。右边的view依赖于currentIndex。

我什么都试过了。之后进行选择:

  • 插入行
  • 数据已更改
  • 当前已更改
  • 更改事件
  • dropEvent
  • 事件过滤器

没有任何效果,因为如果我尝试在这些方法之后更改选择,我会破坏 Qt 内部,导致未终止的 drop 无法正常工作。我需要等待所有从 drop 派生的信号完成才能执行选择和展开命令。

我很绝望,我已经观察了 TreeWidget 的行为方式,并且遇到了和我一样的问题:当 drop 时,选择的行是错误的并且节点折叠了。

【问题讨论】:

  • 我真诚的建议是重新考虑您对树视图的使用。它们通常很难编程(作为更深奥的 UI 组件之一),实际上也很难使用。还有其他方法可以完成您想要的吗?我已经实现了很多树视图控件,它们很少像你想象的那样有趣!抱歉,如果这不是您希望的技术回复,但这是我的建议 :) 哦,睡一觉...
  • 如何使用 QTimer::singleShot 来执行选择/扩展操作(超时时间很短),例如行插入?该操作应在有关放置操作的 Qt 信号/事件之后排队

标签: python pyqt drag-and-drop pyside2 qtreeview


【解决方案1】:

他们已经在 Qt 论坛中为我解决了这个问题。

我已通过在connect 中添加参数QtCore.Qt.QueuedConnection 来连接自定义信号。

解决办法在这里:
https://forum.qt.io/topic/114716/treeview-wait-until-the-drop-is-complete-to-perform-another-action/3

  1. 我不知道为什么有什么东西会坏掉。通过model test 运行您的模型,以确保它根据 Qt 100% 实现 期待
  2. 添加Qt::QueuedConnection 作为connect ststement 的第5 个参数应确保您的代码在移动后执行 完成,控制权交还给 Qt 的事件循环

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多