Здравствуйте, гость ( Вход | Регистрация )
|
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, 20:26) Link старая это какая, которая была заменена новой да
|
|
|
|
|
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, 21:17) Link т.е. старая модель все-таки должна удаляться Qt этого нигде не написано, читай мой пост, там выделено жирным.П.С. версия Qt в моей подписи |
|
|
|
|
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
|
Цитата(SABROG @ 9.2.2009, 14:39) Link Интересно почему Qt сама не делает deleteLater(). Цитата(Гость_Константин_* @ 9.2.2009, 13:16) Link "старая" селекшн-модель может ещё использоваться Цитата(SABROG @ 9.2.2009, 14:39) Link Или почему нет предупреждения о возможной утечке памяти. Цитата(Litkevich Yuriy @ 8.2.2009, 19:19) Link \bold{Note:} This function will also create and set a new selection model, Link
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
|
Цитата(Litkevich Yuriy @ 9.2.2009, 11:59) Link "старая" селекшн-модель может ещё использоваться ну с deleteLater она удалится после использования, когда управление вернется в режим "ожидания" Цитата(Litkevich Yuriy @ 9.2.2009, 11:59) Link but the old selection model will not be deleted. Да, но тут как-то сказано вскользь, намеками. Тут не сказано, что об удалении должен заботится пользователь. Вот какая еще штука есть Link Если ядро сама удалит какой-то QObject, то он автоматически удаляется из списка. |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 14.12.2025, 1:27 |