Russian Qt Forum

Qt => Общие вопросы => Тема начата: Natalie от Декабрь 26, 2006, 14:14



Название: сортировка по столбцу в QTableView
Отправлено: Natalie от Декабрь 26, 2006, 14:14
Есть QTableView, но использует модель MyModel.

Необходимо произвести сортировку таблицы по какому-нибудь стробцу, но так, чтобы порядок элементов в моделе не изменился (то есть, чтобы изменился порядок отображения элементов).

Стандартная сортировка sortByColumn(int i) не работает.
Нашла здесь на форуме, что можно использовать QSqlQueryModel, но у меня итак уже используется модель MyModel. А в QSqlQueryModel не такого: queryModel->setSourceModel(myModel);

Думала, будет работать функци rowMoved(row, oldIndex, newIndex), но ничего не происходит :(

Помогите, пожалуйста, как мне добиться желаемого результата!


Название: сортировка по столбцу в QTableView
Отправлено: Alexandr Az от Декабрь 26, 2006, 15:35
Если ответит в шутку - то никак.
Если ответить в серьёз - то будет тоже, что и в шутку :)

Да ладно, перестаньте, что нам, помяти жалко!
if (Памяти не жалко :) )
{
   Если название модели опрадывает её название (т.е она действительно Ваша), то прийдётся тупо копировать модель и её данные и ту сортировать. Если нужно сохранить взаимосвязь между моделями, тогда прийдётся ввести ещё один итем в модель, скажем отвечающий за номер строк. QSqlQueryModel может изменить конечно ситуацию. Для этого мы создаём базу данных в памяти (отличнейшим образом подходит SqlLite) и из неё делаем выборку. Итого получаем - один источник данных - sqllite и куча моделей, отсортированых как вам надо. Вариант решать Вам, мыж не знаем что у вас за данные и какая такая дикая модель....
Кстати, насчёт памяти - второй вариант будет менее требователен к ресурсам, т.к. мы не будем хранить все данные выборки из базы данных, а только тех, что просматриваем (с ужасом, я надеюсь они реализовали двунаправленые курсоры в sqllite!!!!)
}

Эка сказать, не шутка чай, девушка кутешница. А звучит!


Название: Re: сортировка по столбцу в QTableView
Отправлено: itan от Декабрь 26, 2006, 17:20
Вообще-то для таких целей используется QSortFilterProxyModel
Код:

QTreeView *treeView = new QTreeView;
MyItemModel *sourceModel = new MyItemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(sourceModel);
treeView->setModel(proxyModel);


Название: сортировка по столбцу в QTableView
Отправлено: Natalie от Декабрь 27, 2006, 03:19
itan, проблема в том, что я использую не QTreeView, а QTableView. А с QTableView QSortFilterProxyModel не работает, во всяком случае, функция lessThan(const QModelIndex & left, const QModelIndex & right) не вызывается :(


Название: сортировка по столбцу в QTableView
Отправлено: Tonal от Декабрь 27, 2006, 07:55
А сортировку по столбцу собственно вызывал - proxyModel->sort(col)?


Название: сортировка по столбцу в QTableView
Отправлено: itan от Декабрь 27, 2006, 09:48
Цитата: "Natalie"
itan, проблема в том, что я использую не QTreeView, а QTableView. А с QTableView QSortFilterProxyModel не работает, во всяком случае, функция lessThan(const QModelIndex & left, const QModelIndex & right) не вызывается :(

Какая версия QT? В 4.2 есть void QTableView::setSortingEnabled ( bool enable ), надо установить ее в true.


Название: сортировка по столбцу в QTableView
Отправлено: Natalie от Декабрь 27, 2006, 12:35
У меня версия 4.1.4, и там нет такой функции :(


Название: сортировка по столбцу в QTableView
Отправлено: itan от Декабрь 27, 2006, 14:26
Цитата: "Natalie"
У меня версия 4.1.4, и там нет такой функции :(

Вот, посмотри, здесь похожая проблема: http://www.qtcentre.org/forum/f-qt-programming-2/t-qsortfilterproxymodellessthan-method-doesnt-work-4270.html


Название: сортировка по столбцу в QTableView
Отправлено: Natalie от Декабрь 28, 2006, 13:45
Большое спасибо тебе, itan!!!!

Все заработало!! :)