2

我正在尝试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); 

但是,该列未排序。有什么建议么?

4

1 回答 1

1

我会替换这一行:

  return leftData.toString() < rightData.toString();

根据官方自定义排序/过滤器模型示例

  return QString::localeAwareCompare(leftData.toString(), leftData.rightString()) < 0;

优点是它将根据文档为用户的语言环境正确处理字符串。

int QString::localeAwareCompare(const QString & other) const

此函数重载 localeAwareCompare()。

将此字符串与另一个字符串进行比较,如果此字符串小于、等于或大于另一个字符串,则返回一个小于、等于或大于零的整数。

比较以区域设置和平台相关的方式执行。使用此函数向用户呈现已排序的字符串列表。

与 localeAwareCompare(*this, other) 相同。

但是,我个人会根据文档使用此任务的排序顺序枚举:

枚举 Qt::SortOrder

上升...

Qt::AscendingOrder 0

项目按升序排序,例如在 Latin-1 语言环境中以 'AAA' 开头并以 'ZZZ' 结尾

下降...

Qt::DescendingOrder 1

项目按降序排序,例如在 Latin-1 语言环境中以“ZZZ”开头以“AAA”结尾

因此,如果没有 lessThan 方法覆盖,这一行就足够了,因为默认排序顺序是升序,这似乎是您的代码试图重新实现的情况。

MyProxy->sort(1);
于 2014-01-12T07:30:53.330 回答