调用 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) 时的意外行为的主要内容,如果未能解决你的问题,请参考以下文章
QSqlQueryModel 配合Qtableview的表格,怎么实现点击头部排序
Qt窗口及控件-QTreeview/QTableView排序问题