crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QAbstractItemView, или внутренности Qt
Litkevich Yuriy
  опции профиля:
сообщение 8.2.2009, 16:19
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 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()
*/

и подтверждение сказаному:
setSelectionModel(new QItemSelectionModel(d->model, this));


Для меня остается загадкой:
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


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(SABROG @ 8.2.2009, 20:26) *
старая это какая, которая была заменена новой
да
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(SABROG @ 8.2.2009, 21:17) *
т.е. старая модель все-таки должна удаляться 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 в цикле на одну вьюху рано или поздно закончится плачевно. Я решил провести эксперимент таким образом:

        QTreeView *tree = new QTreeView(this);
        forever
        {
                tree->setModel(0);
        }


Судя по исходникам нулевой указатель вместо модели должен ставить статическую дефолтную модель при этом создавать каждый раз новую selectedModel. Поедание памяти снимал с диспетчера задач:



Затем я изменил исходник таким образом:

        forever
        {
        QTreeView *tree = new QTreeView(this);
                tree->setModel(0);
                delete tree;
        }


Поедание памяти продолжилось, но на этот раз не существенно, где-то на 10-50кб в секунду.

Сообщение отредактировал SABROG - 8.2.2009, 19:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Константин_*
сообщение 9.2.2009, 10:16
Сообщение #7





Гости








    


страшного ничего в этом нет. просто на момент установки новой модели "старая" селекшн-модель может ещё использоваться и, поскольку мы не хотим сегфолта, модель не удаляем (подобное часто встречается в сорцах кутэ) - на мой взгляд это лучше, чем пол-дюжины проверок в каждом методе (привет, гтк)!
если нужно часто "передёргивать" модель-источник и программист твёрдо уверен, что селекшн-модель в момент установки модели-источника нигде не используется, программист может смело делать так:
        QTreeView *tree = new QTreeView(this);
        forever
        {
                QItemSelectionModel* sm = tree->selectionModel();
                tree->setModel(0);
                sm->deleteLater;
        }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(SABROG @ 9.2.2009, 14:39) *
Интересно почему Qt сама не делает deleteLater().
Цитата(Гость_Константин_* @ 9.2.2009, 13:16) *
"старая" селекшн-модель может ещё использоваться


Цитата(SABROG @ 9.2.2009, 14:39) *
Или почему нет предупреждения о возможной утечке памяти.
Цитата(Litkevich Yuriy @ 8.2.2009, 19:19) *
\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  


Цитата(Litkevich Yuriy @ 9.2.2009, 11:59) *
"старая" селекшн-модель может ещё использоваться

ну с deleteLater она удалится после использования, когда управление вернется в режим "ожидания"

Цитата(Litkevich Yuriy @ 9.2.2009, 11:59) *
but the old selection
model will not be deleted.

Да, но тут как-то сказано вскользь, намеками. Тут не сказано, что об удалении должен заботится пользователь.

Вот какая еще штука есть QObjectCleanupHandler
Если ядро сама удалит какой-то QObject, то он автоматически удаляется из списка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.9.2020, 20:07