【问题标题】:Drag and dropping Qt widgets in a grid at runtime在运行时将 Qt 小部件拖放到网格中
【发布时间】:2015-06-24 21:59:24
【问题描述】:

这就是我想要做的:我有一些通过自定义小部件显示的数据。有很多这样的数据。在运行时,用户将看到所有数据的列表,他们将选择他们想要监控的数据,这将在网格中动态创建自定义小部件。我想让用户按照他们的喜好重新组织网格中的小部件,最好是通过拖放。

我能找到的最接近的方法是使用具有以下属性的 QTableWidget:setDragEnabled(True)、setDragDropOverwriteMode(False)、setDragDropMode(QtGui.QAbstractItemView.InternalMove)。使用这些属性,可以拖动单元格并将它们移动到其他单元格。

但是,这似乎只适用于附加到每个单元格的 QTableWidgetItem,而不是通过 setCellWidget() 设置的小部件。

这是一个小项目,说明了我正在尝试做的事情:https://gist.github.com/anonymous/02bbcc201316fa8f43e9

您可以看到创建的小部件(通过单击按钮)不可拖放,但是如果您编辑单元格(设置 QTableWidgetItem),这些小部件是可拖放的。看起来cellWidget部分和单元格的item部分是完全独立的,拖放逻辑只适用于item,而不适用于cell widget。

恐怕我已经知道答案了,但是……除了用 QTableView 替换 QTableWidget、使用模型并重新实现所有拖放逻辑之外,有什么方法可以做我想做的事吗?我自己?

或者也许我的方法是完全错误的。也许我可以使用其他一些小部件或 Qt 工具?我愿意接受任何和所有建议。

提前致谢!

【问题讨论】:

  • 作为一种解决方法,尝试手动检测掉落并移动单元格小部件。不过,我不确定该怎么做。我认为 Qt 的模型/视图不太适合您的用例(除非您需要一些复杂的功能,例如单元格选择处理)。只需手动在 QGridLayout 中实现拖放即可。

标签: qt gridview drag-and-drop pyqt runtime


【解决方案1】:

我不确定某人回答自己的问题有多好,但我解决了我的问题,我想我会提供我的解决方案。也许它会在未来对某人有所帮助。

这是我所做的:

首先,我编写了一个从 QTableWidget 派生的 GridWidget,带有一个自定义的 dropEvent() 方法来处理移动的小部件。

由于 QAbstractListView 管理附加到索引的小部件列表的方式,无法移动现有小部件,因为原始单元格中的小部件将被破坏。所以我写了一个ContainerWidget,它只是另一个小部件的布局。 ContainerWidget 类有一个 cloneAndPassContainedWidget() 方法,它可以满足您的期望:它返回一个新的 ContainerWidget 并赋予它包含的小部件的所有权。显然,调用该方法后,原来的ContainerWidget就变得没用了,但是该方法被调用(并存在)正是因为widget被设置为销毁,所以这不是问题。

这是一个简单的项目,展示了我在实践中的解决方案:https://gist.github.com/anonymous/a3b2d7e61c6b3e11742c

我相当确定正确的方法是编写模型、视图和委托,但在我的情况下,这需要太多的工作,所以这个解决方案是一个可以接受的解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2012-08-30
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多