在QStandardItemModel中按字母顺序对列进行排序:QSortFilterProxyModel

问题描述:

我试图按字母顺序对QStandardItemModel的特定列中的项进行排序。 为此,我现在用的是从QSortFilterProxyModel派生的类,我重新实现lessThan方法,例如在QStandardItemModel中按字母顺序对列进行排序:QSortFilterProxyModel

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); 

但是,列不显示排序。有什么建议么?

我将取代这一行:

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”开始与拉美-1区域设置“AAA”结束

所以,这条线将不每种不超过方法重写,因为默认的排序顺序是升序足够,这似乎是这样你的代码正试图重新实现。

MyProxy->sort(1); 
+0

谢谢拉兹洛。我知道我可以简单地做到这一点,但我正在尝试使用FilterProxyModel。 – MistyD

+0

谢谢你做到了。也可以解释为什么我的方法不起作用? – MistyD

+0

看起来像你再次感谢 – MistyD