QTableView拖动移动行

8
我正在使用一个带有QAbstractTableModelQSortFilterProxyModelQTableView,以便可以通过单击表头对项目进行排序。我想增加选项,让用户通过拖动来手动排序视图中的行。我不需要能够从/到任何外部应用程序进行拖放,只需更改列表中的顺序即可。我也不需要更改模型中的数据,我只想在视图中使顺序不同。
我一直在查看文档,似乎我必须实现mimeTypesmimeDatadropMimeData,但这很快就变得非常复杂!我的模型中的某些数据实际上没有在视图中显示,就像我说的,我不想更改模型中的数据顺序。是否有一种简单的方法可以拖动项目以更改其排序(就像标题已经能够做到的那样),而不需要大量编码?

你还遇到这个问题吗?我可以尝试给你一个如何轻松进行拖放的答案。然而,根据我的经验,在排序模型中无法插入到特定行:如果你有一个条目"a",并告诉它在任何一行插入"b",它总是会被插入到"a"下面。 - Johannes
1个回答

11

更新为QT5以删除废弃的方法

如果您正在使用PyQT,则只需执行以下操作即可满足您的要求:

your_tableview.verticalHeader().setSectionsMovable(True)
your_tableview.verticalHeader().setDragEnabled(True)
your_tableview.verticalHeader().setDragDropMode(QAbstractItemView.InternalMove)

如果您想让表头也可以重新排列,那么请使用horizontalHeader并重复上述步骤。

您说得很对,甚至不需要触及或了解此功能所需的模型。您正确地使用了QSortFilterProxyModel修饰符,使它覆盖在模型本身上。

关于mimeTypes和所有这些东西是为了从其他窗口/应用程序/桌面等实际对象的拖放和不同来源,而目前您所要完成的任务并不需要这些功能。


1
抱歉打扰了,我没有注意到。删除了我的评论以免引起误导。 - Sergio Martins
实际上,MVC和MV/C的整个重点在于视图不知道数据。视图负责将对数据的给定“行”或“列”的请求从可视行映射到数据的逻辑行。想象一下,模型很大并且由不同的视图共享。只有对模型的更改应该通知其他视图。“如何?”视图最初知道逻辑行/列等于可视行/列。如果视图重新排列它们,它只需将新关系映射到逻辑/可视R/C即可。这就是为什么接口具有能够执行此操作的函数。别想象了,试试吧。 - UpAndAdam
那在Qt5中呢? - ManuelSchneid3r
阅读发布说明。既然我是在qt5中完成的,我认为没有什么区别。但如果你认为除了函数名之外还会有更多变化,那么我认为你是大错特错了。 - UpAndAdam
3
原帖询问如何移动行,需要使用verticalHeader而不是答案中提到的horizontalHeader。另外,setMovable已经过时,现在应该使用setSectionsMovable。文档中仍然存在setMovable,但在Qt Creator中的Qt 5.5.1版本中,我无法编译它。 - goug
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接