3

Я пишу приложение C++, которое использует классы Qt для работы с определенными моделями данных. Для этой цели я унаследовал от QAbstractItemModel:В Qt как сортировать непосредственные дочерние индексы QModelIndex

// 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, но я еще не нашел его.

Есть ли какой-либо учебник/пример, который демонстрирует возможное решение для моего случая или некоторые рекомендации о том, как это сделать?

С уважением

ответ

1

Если вы хотите оптимальное решение, которое не делать сравнений вообще для индексов вы не хотите, чтобы разобраться, я думаю, вы должны reimeplement свой собственный QAbstractProxyModel, который является не - тривиальная задача. Однако, если вы хорошо с неоптимизированным решением, я хотел бы попробовать это:

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

Сравнивая строки в источнике должен оставить все другие, то индексы с этим конкретным родителем, как они.