3

我正在编写一个 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()方法对整个模型进行排序,而我需要的是仅对某个索引的直接子项进行排序。

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

我认为一定有一种方法可以只对某个的直接孩子进行排序QModelIndex,但我还没有找到。

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

问候

4

1 回答 1

3

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

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

比较源中的行应该使除索引之外的所有内容与特定的父对象保持原样。

于 2012-05-23T20:33:21.953 回答