我正在尝试按字母顺序对QStandardItemModel
的特定列中的项目进行排序。
为此,我使用的是一个派生自QSortFilterProxyModel
的类,我正在重新实现lessThan
方法
bool MyProxy::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
QVariant leftData = sourceModel()->data(left);
QVariant rightData = sourceModel()->data(right);
if( left.column() == 1)
{
return leftData.toString() < rightData.toString();
}
return false;
}
以下是我如何将模型附加到代理模型
MyStandardItemModel=new QStandardItemModel();
MyProxy= new MyProxy();
MyProxy->setSourceModel(pModelContacts);
ui.ContactView->setModel(MyProxy);
在向模型添加项目之后,这就是我要做的排序
MyProxy->sort(1);
但是该列未显示已排序。有什么建议吗?
答案 0 :(得分:1)
我会替换这一行:
return leftData.toString() < rightData.toString();
根据官方custom sort/filter model example:
return QString::localeAwareCompare(leftData.toString(), leftData.rightString()) < 0;
优点是它将根据文档正确处理用户区域设置的字符串。
int QString::localeAwareCompare(const QString & other) const
此函数重载localeAwareCompare()。
将此字符串与另一个字符串进行比较,如果此字符串小于,等于或大于另一个字符串,则返回小于,等于或大于零的整数。
比较以场所和平台相关的方式进行。使用此函数可向用户显示已排序的字符串列表。
与localeAwareCompare(* this,other)相同。
但是,我个人只会根据documentation使用此任务的排序顺序枚举:
枚举Qt :: SortOrder
...升序
Qt :: AscendingOrder 0
项目按升序排序,例如以'AAA'开头,以Latin-1语言环境中的'ZZZ'结尾
...降序
Qt :: DescendingOrder 1
项目按降序排序,例如以'ZZZ'开头,以Latin-1语言环境中的'AAA'结尾
因此,如果没有lessThan方法覆盖,这一行就足够了,因为默认的排序顺序是升序的,而且似乎是你的代码试图重新实现的情况。
MyProxy->sort(1);