使用QTableWidget排序

时间:2018-04-26 16:14:33

标签: c++ qt

我有一个QTableWidget。 我有一个排序文件和文件夹的问题。我已经尝试了以下的meethods:

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

假设我的第一列包含文件和文件夹。如何确保文件夹始终位于顶部,文件保留在文件夹之后?

我是否需要实现某种布尔运算符" < "对于QTableWidget类。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您不应该将QTableWidget用于文件和文件夹,因为文件和文件夹的数量未知。 QTableWidget的大量项目表现不佳。

你应该学习如何做Model/View programming,在链接中有一个关于如何处理文件的例子。

使用模型视图,您有一个从模型中获取信息的视图。该模型可以(几乎)任意巨大,并且视图不关心,因为它只加载它正在查看的内容。这与QTableWidget不同,后者会一直加载所有内容,并导致性能提升。

现在关于排序的问题,您应该使用QSortFilterProxyModel,将其设置为视图的模型,并在QSortFilterProxyModel内设置源模型。代理在视图和模型之间作为中间人工作,并且可以在传递信息之前对信息进行排序和过滤。这是在Qt中对表进行排序的正确方法。

答案 1 :(得分:1)

是的,您可以重载<()运算符并实现排序逻辑。

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应该没问题。如果您注意到排序将花费几秒钟的时间进行切换。