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

2024-10-06 12:32:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个QTreeWidget,我注意到它具有将列标题从原始位置拖到新位置的功能。我想在应用程序中使用此功能,但当我将列标题拖到新位置时,QTreeWidget似乎不会保留任何QTreeWidgetItems中的列更改。你知道吗

在将标题拖到新位置后,我尝试遍历列并打印出QTreeWidget标题项中每列的文本,但这似乎没有保留任何更改。接下来,我尝试重写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列的文本,但它仍然以旧顺序打印头列,然后再将任何列拖到新位置。你知道吗


Tags: 函数代码文本self功能应用程序ui标题
1条回答
网友
1楼 · 发布于 2024-10-06 12:32:58

@G.M.帮助我在评论中指出了正确的方向,以绕过这个问题。 最初,我是用^{}方法直接访问我的头,但是要获得逻辑索引我需要将头设置为^{}对象。你知道吗

我创建了一个QHeaderView,启用了它的movable sections功能,并将其设置为我的QTreeWidget的标题:

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

然后,当我想在进行更改后循环遍历列时,我使用 ^{}返回的列索引找到了每一列的文本。你知道吗

修改后的调试代码在列中循环,并在用户移动列节后打印出列节的文本,如下所示:

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))

相关问题 更多 >