QStandardItem树的sortChildren()排序会对全树进行排序,该排序只能简单设置为倒序或正序,无法设置其它规则,实现其它规则需要用户手动定制排序。
本文提供了一种无需遍历全树的可实现任意排序规则的方法——重新实现一个appendRow()函数来代替QStandardItem::appendRow(),使得在创建QStandardItem时即时进行排序。
小贴士:若仅使用sortChildren()的简单自动排序请参考:https://blog.csdn.net/qq_43058397/article/details/113109239
示例
以一个文件夹置上、文件置于下,二都按字母升序的排列方法为例。
小贴士:对于其中的sort()排序函数的简介请参考:https://blog.csdn.net/qq_43058397/article/details/113107328
函数原型:
void appendRow(QStandardItem * item, QStandardItem * childItem);//在项item中添加child项, 并排列
实现:
void appendRow(QStandardItem * item, QStandardItem * childItem)
{
item->appendRow(childItem);
//以下要达成的排序目的为: 文件夹置于上, 文件置于下, 二者都按升序排列
//步骤:
//1.将item下的项名称全部提取, 并按文件夹和文件进行区分存储于两个QStringList中, 之后分别进行排序
//2.根据排序将item中的项指针复制到一个QList列表中
//3.移走item下的所有项, 并设置成QList中的项
QStringList listDir;
QStringList listFile;
for(int i = 0; i < item->rowCount(); ++i)
{
if(item->child(i)->text().contains('.'))
listFile.append(item->child(i)->text());
else
listDir.append(item->child(i)->text());
}
std::sort(listDir.begin(), listDir.end());
std::sort(listFile.begin(), listFile.end());
QList<QStandardItem *> list;
for(int d = 0; d < listDir.size(); ++d)
{
for(int i = 0; i < item->rowCount(); ++i)
{
if(item->child(i)->text() == listDir[d])
list.append(item->child(i));
}
}
for(int f = 0; f < listFile.size(); ++f)
{
for(int i = 0; i < item->rowCount(); ++i)
{
if(item->child(i)->text() == listFile[f])
list.append(item->child(i));
}
}
int itemRC = item->rowCount();
for(int i = 0; i < itemRC; ++i)
item->takeRow(0);//每删除一项, 剩余的项都会自动补充, 因此只需删除第一项指定次数即可
for(int i = 0; i < list.size(); ++i)
item->setChild(i, list[i]);
}