Russian Qt Forum
Ноябрь 25, 2024, 08:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFileSystemView и закрытие приложения  (Прочитано 3720 раз)
Rain
Гость
« : Февраль 17, 2009, 00:25 »

Прощу прощения, если слишком много тем за один вечер, но:

Имеется простейшее тестовое приложение которое занимается только тем, что строит дерево каталогов. Заметил, что иногда после закрытия приложения процесс остается висеть и его приходится прибивать руками. Такое поведение началось после того, как я вместо QDirModel стал использовать QFileSystemModel. Причиной насколько я понимаю является

Цитировать
Unlike the QDirModel, QFileSystemModel uses a separate thread to populate itself so it will not cause the main thread to hang as the file system is being queried.

Как избежать таких проблем? По-идее при закрытии приложения нужно прерывать выполнение фонового потока QFileSystemModel, но в документации не нашел ничего об этом... :-(
Записан
ритт
Гость
« Ответ #1 : Февраль 17, 2009, 00:29 »

для QFileSystemModel назначен родитель?
а лучше покажи как используешь - чтобы не гадать...
Записан
Rain
Гость
« Ответ #2 : Февраль 17, 2009, 00:33 »

Вот таким образом:

Код:
QPointer<QFileSystemModel> fsModel;

Код:
fsModel = new QFileSystemModel;
ui.dirTreeView->setModel(fsModel);

Код:
void MainWindow::on_exitAction_triggered()
{
qApp->exit();
}
Записан
ритт
Гость
« Ответ #3 : Февраль 17, 2009, 02:16 »

а fsModel где-то прибивается delete-ом? зачем купоинтер?

попробуй так:
Код
C++ (Qt)
fsModel = new QFileSystemModel(ui.dirTreeView);
ui.dirTreeView->setModel(fsModel);
 

да и вообще не стоит пренебрегать родительско-дочерними связями - не для того эта возможность реализовывалась в объектах кутэ, чтобы предоставлять объекты воле случая...
« Последнее редактирование: Февраль 17, 2009, 02:18 от Константин » Записан
Rain
Гость
« Ответ #4 : Февраль 17, 2009, 08:57 »

Код:
[quote author=Константин link=topic=8596.msg47723#msg47723 date=1234826192]
а fsModel где-то прибивается delete-ом? зачем купоинтер?

А QPointer это разве не смартпоинтер (аналог STL-ного auto_ptr)?

да и вообще не стоит пренебрегать родительско-дочерними связями - не для того эта возможность реализовывалась в объектах кутэ, чтобы предоставлять объекты воле случая...

Да, видимо в этом есть смысл
Цитировать
The destructor of a parent object destroys all child objects.
Хотя я всегда думал, что parent-child связи имеют значение только для визуальных контролов.
Записан
Rcus
Гость
« Ответ #5 : Февраль 17, 2009, 09:31 »

Цитировать
The QPointer class is a template class that provides guarded pointers to QObjects.

A guarded pointer, QPointer<T>, behaves like a normal C++ pointer T *, except that it is automatically set to 0 when the referenced object is destroyed (unlike normal C++ pointers, which become "dangling pointers" in such cases). T must be a subclass of QObject.

Guarded pointers are useful whenever you need to store a pointer to a QObject that is owned by someone else, and therefore might be destroyed while you still hold a reference to it. You can safely test the pointer for validity.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.068 секунд. Запросов: 20.