使用 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_cast(&other);现在,我不确定如何进行。你能告诉我需要处理的案件吗?而不是 if(colum == file),你如何在这里使用“其他”?提前致谢。 Math_Enthusiast:您需要为项目设置一个属性,例如setData()。否则,您无法知道哪一行是文件夹或文件。然后在&lt;() 运算符中读取属性并返回真或假。或者,如果您已将文件夹设置为图标,则可以使用 icon() 阅读。 好的,我有一个程序,通过它,我可以知道参数“other”是文件还是文件夹。然后对于我的问题陈述,文件夹应该保留在顶部。因此,例如,如果我检索到“其他”是一个文件,我是否返回 false,如果“其他”是文件夹,我是否返回 true?? Math_Enthusiast:你有QTableWidgetItem::text()other.text()。也许它适用于您所说的随机文件夹排序。如果要从 A-Z 对文件夹进行排序,则需要按名称和属性文件夹进行比较。 我还是没听清楚,伙计。假设,我有属性“文件”和“文件夹”。所以,现在你有了文件 other.file ;文件夹;其他文件夹。就像,如果给定的项目是文件,文件将返回,如果给定的项目是文件夹,文件夹将返回。如何确保文件夹始终位于顶部?另外,在这个过程中,我是否需要添加这些行: ui.table->setSortingEnabled( true ) ??你能解释一下实现吗,如果像我说的那样我有所有 4 个参数(文件、其他.file、文件夹、其他.文件夹)。

以上是关于使用 QTableWidget 排序的主要内容,如果未能解决你的问题,请参考以下文章

为自定义模型使用 QTableWidget 的排序功能

如何通过单击列的标题按列对 QTableWidget 进行排序?

对 QTableWidget 中的数字列进行排序

如何用我自己的代码对 QTableWidget 进行排序?

使用 PyQt/PySide 禁用 QTableWidget 中特定列中的排序箭头

列标签的 QTableWidget 排序