如何使用 qt 的拖动功能保留 header 项目列重新排序

How to retain header item column reordering with qt's drag functionality

我有一个 QTreeWidget,我注意到它具有将 header 列从其原始位置拖动到新位置的功能。我想在我的应用程序中使用此功能,但是当我将列 header 拖到新位置时,QTreeWidget 似乎没有保留任何 QTreeWidgetItems 中的列更改。

在 header 被拖到新位置后,我尝试遍历列并打印出 QTreeWidget 的 header 项目中每一列的文本,但这似乎没有保留任何更改。接下来,我尝试重写 QTreeWidget::dropEvent 函数,但我注意到此函数仅在 QTreeWidgetItem 被拖动到新位置而不是列时被激活。

用于打印出 HeaderItem 中每列文本的调试代码:

column_count = self.ui.treeWidget.headerItem().columnCount()
for ii in range(column_count):
    print(self.ui.treeWidget.headerItem().text(ii))

我不需要在更改发生时立即捕捉到它,我只是希望能够在这些列之一拖放之后的某个时间点找到应用到 QTreeWidget 列的任何更改。我希望上面的调试代码打印出新排序的 headerItem 列的文本,但在任何列被拖动到新位置之前,它仍然以旧顺序打印 header 列。

@G.M。帮助我在评论中指出了正确的方向来解决这个问题。 最初,我是直接使用 QTreeWidget::headerItem method, but to get the logical index I needed to set the header to be a QHeaderView object.

访问我的 header

我创建了一个 QHeaderView,启用了它的可移动部分功能,并将它设置为我的 QTreeWidget 的 header:

self.headerView = QtWidgets.QHeaderView(QtCore.Qt.Orientation.Horizontal)
self.headerView.setSectionsMovable(True)
self.ui.treeWidget.setHeader(self.headerView)

然后,当我想在进行更改后遍历列时,我使用 QHeaderView::logicalIndex 返回的列索引找到了每列的文本。

经过修改的调试代码循环遍历列并打印出列部分的文本它们被用户移动后如下:

column_count = self.headerView.count()
for ii in range(column_count):
    logical_index = self.headerView.logicalIndex(ii)
    print(self.ui.treeWidget.headerItem().text(logical_index))