QtableWidget实现对汉字和QDateTime类型数据的排序


前言

QT Creator中,QTableWidget的使用非常频繁,很多场合都需要使用表格并按照一定的需求进行排序。表格中的数据类型可以是数字,字符,汉字,日期,时间等。本文简单给出介绍对QTablewidget进行汉字和QDatetime类型进行排序的方式,主要使用qSort函数,且不涉及重写QTablewidgetItem类
传送门:QWidegtTest.7z
排序前:

在这里插入图片描述
排序后:
在这里插入图片描述
点击表头进行排序:
在这里插入图片描述

一、对汉字进行排序

对汉字排序需要使用以下两个类。

#include <QLocale>
#include <QCollator>
void Widget::slot_chSort()
{
    QLocale local(QLocale::Chinese);
    QCollator collator(local);
    //启用数字排序
	collator.setNumericMode(true);
	
    QStringList list;

    for(int i=0;i<ui->tableWidget_2->rowCount();i++)
    {
        if(ui->tableWidget_2->item(i,0)!=nullptr && !ui->tableWidget_2->item(i,0)->text().isEmpty())
        {
            list.append(ui->tableWidget_2->item(i,0)->text());
        }
    }

    qSort(list.begin(),list.end(),collator);

    ui->tableWidget_2->clearContents();
    for(int i=0;i<list.count();i++)
    {
        ui->tableWidget_2->setItem(i,0,new QTableWidgetItem(list[i]));
    }

    ui->tableWidget_2->setSortingEnabled(true);
}

二、对QDatetime进行排序

1.setSortingEnabled

直接使用setSortingEnabled,然后点击表头进行排序是最简便的方法,Qt的Qtablewidget本身是提供了排序功能的。

void Widget::init()
{
    //运行点击表头进行排序
    ui->tableWidget->setSortingEnabled(true);
    //排序接口
//    ui->tableWidget->sortItems(0,Qt::AscendingOrder);

}

2.对不同数据类型进行排序,如QDateTime

void Widget::slot_timeSort()
{
    QList<QDateTime> list;
    //将tablewidget中指定列数据添加到QList
    for(int i=0;i<ui->tableWidget->rowCount();i++)
    {
        QDateTime time = QDateTime::fromString(ui->tableWidget->item(i,0)->text(),"yyyy-MM-dd hh:mm:ss");
        list.append(time);
    }

    //    std::sort(list.begin(), list.end(), &Widget::compareDec); 错误用法
    //    std::sort(list.begin(), list.end(), [](QDateTime &time1, QDateTime &time2){return time1>time2;});
    qSort(list.begin(), list.end(), [](QDateTime &time1, QDateTime &time2){return time1>time2;});

    for(int row=0;row<list.size();row++)
    {
        ui->tableWidget->item(row,0)->setText(list[row].toString("yyyy-MM-dd HH:mm:ss"));
    }

    //ui->tableWidget->setItem(1,1,ui->tableWidget->item(1,0))); 错误用法
//    ui->tableWidget->setItem(1,1,new QTableWidgetItem(ui->tableWidget->item(1,0)->text()));

    ui->tableWidget->setSortingEnabled(true);
}

三、注意事项

1.汉字排序是不区分多音字的,比如长(chang)和长(zhang),你会发现排序时它会被放到了z字母的位置。
2.使用qSort或者std::sort()时,第三个参数无法传入成员函数,如果想传入函数,只能写成lambda形式,如果想自定义一个bool类型函数然后作为第三个参数,是会报错的。
3.使用setItem时,注意不要直接把某个item拿来使用,如ui->tableWidget->setItem(1,1,ui->tableWidget->item(1,0)));,想把第二行第一个项的数据写如到第二行第二个时是会提示QTableWidget: cannot insert an item that is already owned by another QTableWidget,但是可以改为QTableWidget: cannot insert an item that is already owned by another QTableWidget
4.指定列进行排序,需要使用sortItems,第一个参数指定列,第二个参数指定排序方式(升序或降序)。
5.collator.setNumericMode(true);如果未加入这行代码,表格中输入1,4,5,14,15。。。,排序后会显示1,14,15,4,5。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰封的雪绒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值