在 Qt 中如何对 QModelIndex 的直接子索引进行排序

Posted

技术标签:

【中文标题】在 Qt 中如何对 QModelIndex 的直接子索引进行排序【英文标题】:In Qt how to sort the immediate child indexes of a QModelIndex 【发布时间】:2012-05-23 16:47:14 【问题描述】:

我正在编写一个 C++ 应用程序,它使用 Qt 类来处理某些数据模型。为此,我继承自QAbstractItemModel

// the following is a class that represents the actual data used in my application
class EventFragment

....
private:
    qint32 address;
    QString memo;
    QDateTime dateCreated;
    QVector<EventFragment*> _children;
....
;

// the following is the model representation that used by my application to display the actual details to the user
class EventModel : public QAbstractItemModel

     Q_OBJECT
public:
     explicit EventModel (QObject *parent = 0);
....
private:
     // the following is the root item within the model - I use a tree-like presentation to show my data
     EventFragment* _rootFragment;
;

在某些时候,我的应用程序需要一个排序/过滤选项,因此我还创建了一个继承自 QSortFilterProxyModel 的类

class EventProxyModel : public QSortFilterProxyModel

     Q_OBJECT
public:
     explicit EventProxyModel (QObject *parent = 0);
...
public:
     // I had to add my custom implementation in the 'lessThan' method to achieve a
     // more complex sort logic (not just comparing the actual values but using
     // additional conditions to compare the two indexes)
     virtual bool lessThan ( const QModelIndex & left, const QModelIndex & right ) const;
...
;

为了实现排序,我使用了默认的QSortFilterProxyModel::sort() 方法(我还没有在我的代理模型类中重新实现它)并且有一段时间它似乎可以工作。

但在某些时候,我注意到实际的 QSortFilterProxyModel::sort() 方法对整个模型进行排序,而我需要的是仅对某个索引的直接子项进行排序。

我尝试重新实现EventModel 类的sort() 方法,但过了一会儿我意识到QSortFilterProxyModel::sort() 根本不是指它。另一方面,我不确定如何以安全的方式重新排列索引,以便显示模型的视图不会崩溃。

我想一定有办法只对某个QModelIndex的直系子级进行排序,但我还没有找到。

是否有任何教程/示例可以演示我的案例的可能解决方案,或有关如何做到这一点的一些指南?

问候

【问题讨论】:

【参考方案1】:

如果您想要一个优化的解决方案,根本不对您不想排序的索引进行比较,我认为您必须重新实现自己的 QAbstractProxyModel,这是一项不平凡的任务。但是,如果您对未优化的解决方案感到满意,我会试试这个:

bool EventProxyModel::lessThan( const QModelIndex & left, const QModelIndex & right ) const 
    if ( left.parent() == isTheOneToSortChildrenFor ) 
        ...apply custom comparison
     else 
        return left.row() < right.row();
    

比较源中的行应该将除索引之外的所有内容保留为该特定父项。

【讨论】:

以上是关于在 Qt 中如何对 QModelIndex 的直接子索引进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Qt入门教程高级控件篇QModelIndex索引

Qt之QHeaderView自定义排序(获取正确的QModelIndex)

在 Qt 中确定父窗体的类型

Qt中如何写一个model

(Qt) 如何在视图中实现 editorOpened(index) 和 editorClosed(index) 信号

Qt中如何写一个model(自定义一个RowNode,我没有碰到过)