前言
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。