crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTreeWidget default order
DEADHUNT
  опции профиля:
сообщение 4.9.2010, 23:46
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


QTreeWidget заполнен элементами, затем включаем сортировку и сортируем по некоторой колонке:
setSortingEnabled(true);
sortItems(0, Qt::AscendingOrder);

затем требуется восстановить исходный порядок и выключить сортировку:
setSoringEnabled(false);

как проще(правильнее) восстановить исходный порядок, при добавление элементов сохранять порядок, а в конце вызывать повторную сортировку, например так:
setSoringEnabled(false);
sortItems(-1, Qt::AscendingOrder);

?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 5.9.2010, 1:21
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(DEADHUNT @ 5.9.2010, 0:46) *
QTreeWidget заполнен элементами, затем включаем сортировку и сортируем по некоторой колонке:
setSortingEnabled(true);
sortItems(0, Qt::AscendingOrder);

затем требуется восстановить исходный порядок и выключить сортировку:
setSoringEnabled(false);

как проще(правильнее) восстановить исходный порядок, при добавление элементов сохранять порядок, а в конце вызывать повторную сортировку, например так:
setSoringEnabled(false);
sortItems(-1, Qt::AscendingOrder);

?


А данные для него откуда берутся? Первоначальный порядок от чего зависит? Скорее всего придется в данные добавить еще одно скрытое поле, и вначале в нем сохранять номер строки, а в конце сортировать по этому скрытому полю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 5.9.2010, 13:01
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


первоначальный порядок зависит от порядка добавления элементов в QTreeWidget. в QTreeWidget все элементы имеют переопределённый operator<, а то что ты мне предлагаешь это плохой подход который был у меня раньше.

Сообщение отредактировал DEADHUNT - 5.9.2010, 13:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 5.9.2010, 17:23
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Может отказаться от QTreeWidget в пользу QTreeView + Собственная модель + QSortFilterProxyModel

P.S. В своём проекте я поступил ещё более прямолинейно. У меня в модели два контейнера. Один всегда содержит оригинальные данные. Второй тот, который подвергается сортировкам и фильтрации. Он же и отображается. Если нужно восстановить исходный порядок, я просто копирую данные из первого контейнера во второй.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 5.9.2010, 17:39
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


смысл писать свою модель если все ровно выйдёт что-то типа QTreeWidget, вот так сделал:
class TreeItem : public QTreeWidgetItem {
public:
    TreeItem(QTreeWidget *parent)
        : QTreeWidgetItem(parent)
    {
        bool block = parent->blockSignals(true);
        setData(0, Qt::UserRole, parent->topLevelItemCount());
        parent->blockSignals(block);
    }    

    bool operator<(const QTreeWidgetItem &other) const
    {
        const int column = treeWidget()->sortColumn();
        if (column == 0 &&
            !treeWidget()->isSortingEnabled()) // default order
        {
            return (data(0, Qt::UserRole).toInt() < other.data(0, Qt::UserRole).toInt());                
        }
        return (text(column) < other.text(column));
    }
};

когда нужно получить default order:
setSortingEnabled(false);
sortItems(0, Qt::AscendingOrder);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 16.5.2024, 22:11