使用 QTableWidget 排序
Posted
技术标签:
【中文标题】使用 QTableWidget 排序【英文标题】:Sorting using QTableWidget 【发布时间】:2018-04-26 16:14:33 【问题描述】:我有一个 QTableWidget。 我在排序文件和文件夹时遇到问题。我尝试了以下方法:
ui.table->horizontalHeader()->sortIndicatorOrder();
ui.table->sortItems(columnNumber, Qt::AscendingOrder);
假设我的第一列由文件和文件夹组成。如何确保文件夹始终位于顶部,而文件仍位于文件夹之后?
我是否需要为 QTableWidget 类实现某种布尔运算符“
提前致谢!
【问题讨论】:
【参考方案1】:你不应该对文件和文件夹使用 QTableWidget,因为文件和文件夹的数量是未知的。 QTableWidget 在处理大量项目时表现不佳。
你应该学习如何做Model/View programming,并且在链接中有一个关于如何处理文件的例子。
有了模型视图,您就有了一个从模型中获取信息的视图。该模型可以(几乎)任意巨大,视图并不关心,因为它只加载它正在查看的内容。这与 QTableWidget 不同,它一直加载所有内容,并导致性能提升。
现在关于您关于排序的问题,您应该使用QSortFilterProxyModel
,您将其设置为视图的模型,并在QSortFilterProxyModel
中设置源模型。代理充当视图和模型之间的中间人,可以在传递信息之前对信息进行排序和过滤。这才是 Qt 中表格排序的正确方式。
【讨论】:
感谢您的回复。性能真的不是问题。请解释在 QTableWidget 中执行此操作的方法 @Math_Enthusiast,对不起。我不会以错误的方式做事。也许其他人可以帮助您以错误的方式进行操作。您或许可以将此视为学习如何正确行事的机会。 这两个答案都很有价值。关于 Qt 中的体系结构和开发,这个更正确,user3606329 的答案更适合快速解决问题【参考方案2】:是的,您可以重载<()
运算符并实现排序逻辑。
class CustomTableWidgetItem : public QTableWidgetItem
public:
CustomTableWidgetItem(const QString txt = QString("0"))
:QTableWidgetItem(txt)
setTextAlignment( Qt::AlignCenter ); /* center the text */
bool operator <(const QTableWidgetItem& other) const
/* Implement logic here */
/* e.g if(column == file) return true; */
/* else return false; */
;
然后使用new CustomTableWidgetItem
而不是new QTableWidgetItem
。阅读我的other post,了解它是如何在小部件上完成的。
性能说明:如果您有很多行,请使用模型视图方法,如果您只处理几行 QTableWidget 应该没问题。如果您注意到排序需要几秒钟的时间,那么是时候切换了。
【讨论】:
感谢您的回复。基本上,我对需要实现的逻辑有点困惑。 auto *otheritem = dynamic_castsetData()
。否则,您无法知道哪一行是文件夹或文件。然后在<()
运算符中读取属性并返回真或假。或者,如果您已将文件夹设置为图标,则可以使用 icon()
阅读。
好的,我有一个程序,通过它,我可以知道参数“other”是文件还是文件夹。然后对于我的问题陈述,文件夹应该保留在顶部。因此,例如,如果我检索到“其他”是一个文件,我是否返回 false,如果“其他”是文件夹,我是否返回 true??
Math_Enthusiast:你有QTableWidgetItem::text()
和other.text()
。也许它适用于您所说的随机文件夹排序。如果要从 A-Z 对文件夹进行排序,则需要按名称和属性文件夹进行比较。
我还是没听清楚,伙计。假设,我有属性“文件”和“文件夹”。所以,现在你有了文件 other.file ;文件夹;其他文件夹。就像,如果给定的项目是文件,文件将返回,如果给定的项目是文件夹,文件夹将返回。如何确保文件夹始终位于顶部?另外,在这个过程中,我是否需要添加这些行: ui.table->setSortingEnabled( true ) ??你能解释一下实现吗,如果像我说的那样我有所有 4 个参数(文件、其他.file、文件夹、其他.文件夹)。以上是关于使用 QTableWidget 排序的主要内容,如果未能解决你的问题,请参考以下文章
如何通过单击列的标题按列对 QTableWidget 进行排序?