【问题标题】:Sorting using QTableWidget使用 QTableWidget 排序
【发布时间】:2018-04-26 16:14:33
【问题描述】:

我有一个 QTableWidget。 我在排序文件和文件夹时遇到问题。我尝试了以下方法:

ui.table->horizontalHeader()->sortIndicatorOrder();
ui.table->sortItems(columnNumber, Qt::AscendingOrder);

假设我的第一列由文件和文件夹组成。如何确保文件夹始终位于顶部,而文件仍位于文件夹之后?

我是否需要为 QTableWidget 类实现某种布尔运算符“

提前致谢!

【问题讨论】:

    标签: c++ qt


    【解决方案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、文件夹、其他.文件夹)。
    猜你喜欢
    • 2022-11-24
    • 2016-01-26
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多