在 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之QHeaderView自定义排序(获取正确的QModelIndex)