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

时间:2014-01-12 06:51:28

标签: c++ qt qtgui qstandarditemmodel qsortfilterproxymodel

我正在尝试按字母顺序对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); 

但是该列未显示已排序。有什么建议吗?

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