在运行时将Qt小部件拖放到网格中

时间:2015-04-17 21:22:39

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

以下是我要做的事情:我有一些通过自定义小部件显示的数据。有很多这样的数据。在运行时,将向用户显示所有数据的列表,他们将选择要监视的数据,这将在网格中动态创建自定义小部件。我想让用户随意重新组织网格中的小部件,最好是拖放。

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

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

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

你可以看到创建的小部件(通过点击按钮)不是拖拽的,但是如果你编辑一个单元格(设置QTableWidgetItem),那些就是拖拽。看起来cellWidget部分和单元格的项目部分完全独立,拖放逻辑仅适用于项目,而不适用于单元格小部件。

我担心我已经知道了答案,但是...有没有办法做我想要的,没有用QTableView替换QTableWidget,使用模型,并重新实现所有的拖放逻辑自己?

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

我不确定有人回答他们自己的问题是多么好,但我解决了我的问题,我想我会提供我的解决方案。也许它将来会帮助某人。

这是我做的:

首先,我编写了一个源自QTableWidget的GridWidget,它使用自定义的dropEvent()方法处理移动的小部件。

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

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

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