调用 setSortingEnabled(1) 时的意外行为

Posted

技术标签:

【中文标题】调用 setSortingEnabled(1) 时的意外行为【英文标题】:Unexpected behaviour when setSortingEnabled(1) is called 【发布时间】:2013-07-11 10:14:30 【问题描述】:

我有一个QTableWidget,第一列填充了可检查的项目,所以我需要重载这些项目才能对它们进行排序。当我单击该列的标题时,排序按预期工作(行已排序 - 首先有选中的行,然后没有选中)。

当我运行我的 GUI 并且不单击任何列的标题对表进行排序然后执行此操作时,就会出现问题:

tableWidget.setSortingEnabled(0); 
// check/uncheck some checkable items here
tableWidget.setSortingEnabled(1);

在这种情况下,覆盖 __lt__ 被调用了 100 多次,但我没想到会这样,因为我没有单击该列的标题进行排序。那么,为什么会调用 __lt__ 呢?为什么即使我没有单击该列的标题对它们进行排序,它也会比较一些可检查的项目?

请帮帮我,当我有 30 多行时,调用 __lt__ 会消耗太多时间。

【问题讨论】:

【参考方案1】:

来自文档(C++ qt 但适用):

sortingEnabled : bool

此属性保存是否启用排序。

如果此属性为 true,则为表启用排序。如果这 属性为 false,未启用排序。默认值为 false。

注意:。 使用 setSortingEnabled() 将属性设置为 true 立即使用当前排序触发对 sortByColumn() 的调用 部分和顺序。

如果您查看 QHeaderView 的文档(由小部件查询以了解要排序的列),您可以阅读:

int QHeaderView::sortIndicatorSection () const

返回具有排序指示符的节的逻辑索引。经过 默认为 第 0 节

另请参见 setSortIndicator()、sortIndicatorOrder() 和 setSortIndicatorShown().

还有:

Qt::SortOrder QHeaderView::sortIndicatorOrder () 常量

返回排序指示器的顺序。如果没有部分有排序 指示此函数的返回值是undefined

所以你应该小心这个

【讨论】:

感谢您的回答。首先,我已经在setSortingEnable(1) 之前和之后尝试过sortIndicatorSection(),两个结果都是“7”。我有 7 列(0-6),所以我猜默认排序部分不是 0,而是表外的列(在我的情况下是第 7 部分),尽管排序的行为就像它是 0。也许那是因为我有 tableWidget 而不是 tableView ? 无论如何,您的回答为我指明了正确的方向,我发现了这一点:void QHeaderView::setSortIndicator(int logicalIndex, Qt::SortOrder order) - "logicalIndex 可能为 -1,在这种情况下,不会显示排序指示符和模型将恢复到其自然的、未排序的顺序。” .这也适用于 tableWidget,在填充 tableWidget 之前放置该行解决了我的问题。 QTableWidget 继承自 QTableView。但在内部处理模型。奇怪的是 7 回来了。无论如何都很乐意提供帮助:) 我还有一个相关的问题,所以如果您有任何想法,请提出建议:我有这个self.connect(self.tableWidget,SIGNAL("cellChanged(int, int)"), self.DoSomething),所以当我选中/取消选中项目DoSomething 时,我会在禁用排序的地方调用,做一些计算,然后再次启用排序。每次勾选或取消勾选任何一项,setSortingEnabled(1) 都会消耗越来越多的时间,我不知道如何跟进正在发生的事情。 (例如 0.031999 0.041 0.04799 0.05299 .....)

以上是关于调用 setSortingEnabled(1) 时的意外行为的主要内容,如果未能解决你的问题,请参考以下文章

如何排序查看项目

PyQt5:启用对表中的特定列进行排序

QSqlQueryModel 配合Qtableview的表格,怎么实现点击头部排序

Qt窗口及控件-QTreeview/QTableView排序问题

Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实(下)

处理异常 1) 定义 Oracle 函数时 2) 调用 Oracle 函数时