QAbstractItemView, или внутренности Qt |
Здравствуйте, гость ( Вход | Регистрация )
QAbstractItemView, или внутренности Qt |
Litkevich Yuriy |
8.2.2009, 16:19
Сообщение
#1
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
В классе QAbstractItemView есть метод setModel(QAbstractItemModel *model)
Цитата /*! Sets the \a model for the view to present. \bold{Note:} This function will also create and set a new selection model, replacing any previously set with setSelectionModel(), but the old selection model will not be deleted. \sa selectionModel(), setSelectionModel() */ и подтверждение сказаному:
Для меня остается загадкой: 1) либо почему старая не удаляется? 2) либо почему старая не используется? В примере %QTDIR%\demos\sqlbrowser при выполнении запроса устанавливается для табличного представления QSqlQueryModel, а при просмотре таблицы, для этого же представления, устанавливается QSqlTableModel. Человек реально много раз может переключаться с одной работы на другую. Тем самым модели выделения будут создаваться вновь и вновь. Как-то странно это все. |
|
|
SABROG |
8.2.2009, 17:26
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Я мало что понял. Вопрос заключается в том почему тролли не сделали автоматическое удаление модели выделения и почему не используют старую модель выделения (старая это какая, которая была заменена новой, но осталась висеть в памяти и должна использоваться, если конструктор новой не сработал или что?).
|
|
|
Litkevich Yuriy |
8.2.2009, 17:42
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
SABROG |
8.2.2009, 18:17
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Кстати интересно. Написано, что setModel каждый раз устанавливает новую QItemSelectionModel, т.е. старая модель все-таки должна удаляться Qt иначе будет утечка памяти...
|
|
|
Litkevich Yuriy |
8.2.2009, 18:27
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
SABROG |
8.2.2009, 19:31
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
В 4.4.3 ситуация таже. Все экземпляры QItemSelectionModel удаляются только в момент удаления компонентов на базе QAbstractItemView, т.к. именно он является предком. Т.е. только когда удаляются QColumnView, QHeaderView, QListView, QTableView, и QTreeView. Отсюда можно сделать вывод, что setModel в цикле на одну вьюху рано или поздно закончится плачевно. Я решил провести эксперимент таким образом:
Судя по исходникам нулевой указатель вместо модели должен ставить статическую дефолтную модель при этом создавать каждый раз новую selectedModel. Поедание памяти снимал с диспетчера задач: Затем я изменил исходник таким образом:
Поедание памяти продолжилось, но на этот раз не существенно, где-то на 10-50кб в секунду. Сообщение отредактировал SABROG - 8.2.2009, 19:34 |
|
|
Гость_Константин_* |
9.2.2009, 10:16
Сообщение
#7
|
Гости |
страшного ничего в этом нет. просто на момент установки новой модели "старая" селекшн-модель может ещё использоваться и, поскольку мы не хотим сегфолта, модель не удаляем (подобное часто встречается в сорцах кутэ) - на мой взгляд это лучше, чем пол-дюжины проверок в каждом методе (привет, гтк)!
если нужно часто "передёргивать" модель-источник и программист твёрдо уверен, что селекшн-модель в момент установки модели-источника нигде не используется, программист может смело делать так:
|
|
|
SABROG |
9.2.2009, 11:39
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Интересно почему Qt сама не делает deleteLater(). Или почему нет предупреждения о возможной утечке памяти. Скорее всего потому, что вьюха не рассчитана на такое использование модели. Видимо предполагается, что модель должна быть одна-две и вся работа по заполнению/очистки модели должна происходить только с одним экземпляром.
|
|
|
Litkevich Yuriy |
9.2.2009, 12:02
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Интересно почему Qt сама не делает deleteLater(). "старая" селекшн-модель может ещё использоваться Или почему нет предупреждения о возможной утечке памяти. \bold{Note:} This function will also create and set a new selection model, тык
replacing any previously set with setSelectionModel(), but the old selection model will not be deleted. |
|
|
SABROG |
9.2.2009, 12:10
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
"старая" селекшн-модель может ещё использоваться ну с deleteLater она удалится после использования, когда управление вернется в режим "ожидания" but the old selection model will not be deleted. Да, но тут как-то сказано вскользь, намеками. Тут не сказано, что об удалении должен заботится пользователь. Вот какая еще штука есть QObjectCleanupHandler Если ядро сама удалит какой-то QObject, то он автоматически удаляется из списка. |
|
|
Текстовая версия | Сейчас: 30.11.2024, 8:39 |