Russian Qt Forum
Ноябрь 27, 2024, 05:14
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Model-View (MV)
>
QSortFilterProxyModel::dynamicSortFilter
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QSortFilterProxyModel::dynamicSortFilter (Прочитано 8210 раз)
Akon
Гость
QSortFilterProxyModel::dynamicSortFilter
«
:
Декабрь 31, 2012, 08:29 »
Цитировать
Property Documentation
dynamicSortFilter : bool
This property holds whether the proxy model is dynamically sorted and filtered whenever the contents of the source model change.
Note that you should not update the source model through the proxy model when dynamicSortFilter is true. For instance, if you set the proxy model on a QComboBox, then using functions that update the model, e.g., addItem(), will not work as expected. An alternative is to set dynamicSortFilter to false and call sort() after adding items to the QComboBox.
The default value is false.
This property was introduced in Qt 4.2.
Проще говоря, когда данные меняются (добавляются или редактируются через прокси-модель), то при установленном dynamicSortFilter обновления прокси-модели не происходит.
Я имею ТрееВью с прокси-моделью. Сортировка пользователю через ТрееВью не доступна (QTreeView::setSortingEnabled(false)), вместо этого порядок сортировки задан в коде через QSortFilterProxyModel::sort(). Пользователь изменяет данные через ТрееВью, сортировка не работает (как и описано в справке). Я должен отлавливать сигналы изменения исходной модели (dataChanged, rowInserted и т.п.) и делать QSortFilterProxyModel::sort()? Как вы решали эту задачу? Почему проблема не снимается непосредственно в QSortFilterProxyModel, dynamicSortFilter название то характерное?
Всех с Наступающим!
Записан
Bepec
Гость
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #1 :
Декабрь 31, 2012, 10:48 »
С новым.
Когда я пробовал, никак. Пытался проводить динамическую сортировку. В результате пришёл к выводу, что время на сортировку большой модели убивает всю полезность.
PS в конце концов отказался от неё.
Записан
Akon
Гость
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #2 :
Декабрь 31, 2012, 18:45 »
При сортировке по одной колонке, dynamicSortFilter() работает корректно. В моем случае я сортировал по нескольким столбцам с помощью lessThen(), при этом в прокси-модели у меня стояла первая колонка сортировки. Данные менялись в другой колонке, входящей в сортировку, и прокси-модель, отслеживая эти изменения, не обновляля свой марринг индексов (с точки зрения QSortFilterProxyModel колонка то сортировки другая, и изменение никак не может повлиять на сортировку). Мое решение навскидку: в наследнике QSortFilterProxyModel отслеживаются сигналы исходной модели и вызывается sort().
Вопрос Пантеру: в вашем решении по множественной сортировке как решается эта проблема.
«
Последнее редактирование: Декабрь 31, 2012, 19:55 от Akon
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #3 :
Декабрь 31, 2012, 18:58 »
Цитата: Akon от Декабрь 31, 2012, 18:45
Вопрос Партеру: в вашем решении по множественной сортировке как решается эта проблема.
Не знаю кто/что "Партер", но в любом случае "множественная сортировка" весьма мутный термин. Сортировка всегда "одномерна". Может быть задействовано любое число ключей, но в любом случае сначала вычисляется/сравнивается первый. Только если первые ключи равны - используется второй и.т.д. Конечно Вам это прекрасно известно - ну так формулируйте четче
Записан
Akon
Гость
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #4 :
Январь 02, 2013, 09:25 »
Под множественной сортировкой я, конечно же, имел ввиду сортировку по урорядоченному множеству столбцов, т.е. по составному ключу. Прошу прощения за неоднозначную (или непонятную) формулировку.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #5 :
Январь 02, 2013, 11:25 »
Трудновато осмыслить как это должно быть для ТрееВью. Можно небольшой проект?
Записан
twp
Гость
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #6 :
Январь 03, 2013, 00:51 »
Да, как указал Верес, при больших объемах данных пересортировка модели при изменении/добавлении может привести к большим издержкам и самый оптимальный способ - это найти строку в прокси модели, куда должна переместиться существующая или вставиться новая строка. Поскольку данные в модели уже отсортированы, то это можно довольно быстро сделать бинарным поиском.
Записан
Akon
Гость
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #7 :
Январь 03, 2013, 08:04 »
Цитировать
Трудновато осмыслить как это должно быть для ТрееВью. Можно небольшой проект?
Basic Sort/Filter Model Example.
Например, есть две колонки, сортируем по ключу: колонка #0, колонка #1. Кьютовые модели позволяют сортировку только по одной колонке, например, если отсортируем по колонке #0, то в случае равенства значений порядок записей не определяется значениями колонки #1.
Цитировать
Да, как указал Верес, при больших объемах данных пересортировка модели при изменении/добавлении может привести к большим издержкам и самый оптимальный способ - это найти строку в прокси модели, куда должна переместиться существующая или вставиться новая строка. Поскольку данные в модели уже отсортированы, то это можно довольно быстро сделать бинарным поиском.
А реально из-за чего тормоз знаете?
Записан
Bepec
Гость
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #8 :
Январь 03, 2013, 09:41 »
Из-за пересортировки.
Как я подозреваю, при добавлении каждой записи производится сравнение всех строк и соответственно сортировка. При объёме в миллион добавление одной строки тормозит где то на секунды 4-6. Давно уже было, точную цифру назвать сложно.
Но при добавлении группы записей и сортировки раз в 25 м/с модель тормозит всю программу и не оживает.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #9 :
Январь 04, 2013, 09:23 »
Цитата: Akon от Январь 03, 2013, 08:04
Basic Sort/Filter Model Example.
Например, есть две колонки, сортируем по ключу: колонка #0, колонка #1. Кьютовые модели позволяют сортировку только по одной колонке, например, если отсортируем по колонке #0, то в случае равенства значений порядок записей не определяется значениями колонки #1.
Перекрываем lessThan, подаваемые в него QModelIndex содержат номера оригинальных строк. По модели извлекаем данные для доп столбцов и используем
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: QSortFilterProxyModel::dynamicSortFilter
«
Ответ #10 :
Январь 04, 2013, 13:19 »
Для всех вью использующих QStandardItemModel можно через
Код
C++ (Qt)
void
QStandardItemModel
::
setItemPrototype
(
const
QStandardItem
*
item
)
установить прототип с перегруженным operator<.
Имхо, всё будет проще и даже быстрее, чем возня с прокси.
Записан
Qt 5.11/4.8.7 (X11/Win)
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...