【问题标题】:Sorting a column alphabetically in QStandardItemModel: QSortFilterProxyModel在 QStandardItemModel 中按字母顺序对列进行排序:QSortFilterProxyModel
【发布时间】:2014-01-13 16:51:57
【问题描述】:

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

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

【问题讨论】:

    标签: c++ qt qtgui qstandarditemmodel qsortfilterproxymodel


    【解决方案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

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

    下降...

    Qt::DescendingOrder 1

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

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

    MyProxy->sort(1);
    

    【讨论】:

    • 谢谢拉兹洛。我知道我可以简单地做到这一点,但我正在尝试使用 FilterProxyModel。
    • 谢谢你成功了。还可以解释为什么我的方法不起作用?
    • 错字更正:localeAwareCompare(leftData.toString(), rightData.toString())
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2023-04-01
    • 2013-05-02
    • 2014-02-08
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多