Название: Удаление динамических окон QFrame Отправлено: Keeper_B от Марта 07, 2010, 16:15 Поискал на форуме, но ничего подобного не нашёл.
Есть главное окно MainWindow, а в нём при нажатии на кнопки появляются различные окна QFrame. Вопрос как их удалять, при вызове close(), если они динамические? Внизу пример с одним динамическим окном QFrame. Думаю приводить код самого удаляемого окна смысла нет, внизу код главного окна, в котором надо удалять дочерние window. Вот mainwindows.h Код
А вот mainwindow.cpp Код
Название: Re: Удаление динамических окон QFrame Отправлено: alexman от Марта 07, 2010, 17:01 Можно хранить указатель на QFrame в главном окне, а в конструкторе главного окна создать QFrame и в качестве родителя указать главное окно, а далее об удалении не нужно думать!
Название: Re: Удаление динамических окон QFrame Отправлено: SABROG от Марта 07, 2010, 17:23 Код
Название: Re: Удаление динамических окон QFrame Отправлено: Keeper_B от Марта 07, 2010, 17:38 Код
Я пробовал с этим WA_DeleteOnClose, он вылетает при повторном открытии окна Window. Название: Re: Удаление динамических окон QFrame Отправлено: Keeper_B от Марта 07, 2010, 17:47 Можно хранить указатель на QFrame в главном окне, а в конструкторе главного окна создать QFrame и в качестве родителя указать главное окно, а далее об удалении не нужно думать! Не совсем понял мысль. >Можно хранить указатель на QFrame в главном окне так у меня указатель там вроде и хранится. Вот же QFrame* Window; >а в конструкторе главного окна создать QFrame и в качестве родителя указать главное окно Так этож получится, что окно будет постоянно в памяти. А у меня весь цимес в том, что не держать дочерние окна постоянно в памяти, а создавать их по мере надобности. Название: Re: Удаление динамических окон QFrame Отправлено: SABROG от Марта 07, 2010, 17:48 Я пробовал с этим WA_DeleteOnClose, он вылетает при повторном открытии окна Window. А в первом посте сложно было об этом написать? Ты уж выбирай либо одно окно, которое создается один раз и умирает при закрытии приложения, либо каждый раз создавать новое (в этом случае проверку "if (!Window) {" можно убрать). P.S.: пора бы уже знать, что в C++ удаление указателя не приводит к его обнулению. Название: Re: Удаление динамических окон QFrame Отправлено: BRE от Марта 07, 2010, 17:49 Я пробовал с этим WA_DeleteOnClose, он вылетает при повторном открытии окна Window. Конечно будет вылетать. Фрейм при закрытии разрушается, а указатель Window продолжает указывать на разрушенный объект.Попробуй соединять сигнал destroyed объекта Window со своим слотом, который будет "занулять" переменную Window. Название: Re: Удаление динамических окон QFrame Отправлено: Keeper_B от Марта 07, 2010, 17:53 Я пробовал с этим WA_DeleteOnClose, он вылетает при повторном открытии окна Window. А в первом посте сложно было об этом написать? Ты уж выбирай либо одно окно, которое создается один раз и умирает при закрытии приложения, либо каждый раз создавать новое (в этом случае проверку "if (!Window) {" можно убрать). P.S.: пора бы уже знать, что в C++ удаление указателя не приводит к его обнулению. А, всё теперь ясно. :) Я просто не до конца понял, что именно делает WA_DeleteOnClose. >пора бы уже знать, что в C++ удаление указателя не приводит к его обнулению. Это я знаю :) Название: Re: Удаление динамических окон QFrame Отправлено: Igors от Марта 07, 2010, 17:56 Указатель конечно нужно обнулять. Но можно обойтись и без указателя - напр. задав имя создаваемого QFrame (setObjectName) и проверять "уже создано" с помощью findChild
Название: Re: Удаление динамических окон QFrame Отправлено: Keeper_B от Марта 07, 2010, 19:19 Всем спасибо!
РЕШЕНО. Название: Re: Удаление динамических окон QFrame Отправлено: SABROG от Марта 07, 2010, 19:30 Вообще с указателями на QObject'ы правильно так работать:
Код
С маленькой оговоркой - объект не должен удаляться в другом потоке/контексте. Как правило такое может возникнуть в следующей ситуации. QObject создавался в одном потоке, потом мы его переносим через QObject::moveToThread() в другой поток, затем вызываем delete. Тогда будет косяк. Такой объект правильно удалять через QObject::deleteLater(). Опять же если в этом потоке не вызывается exec(), который запускает обработку событий, то deleteLater() не удалит такой объект. То есть помимо обязательного deleteLater() в отдельном потоке вместо delete наличие вызова exec()/processEvents() также обязательно. Иначе нужно отказаться от удаления классов на базе QObject'a в отдельных потоках вообще. Можно конечно отказаться от QWeakPointer'a и использовать обычный указатель, который обнулять потом, обернув все это в мутекс, только это решение может иметь последствия, если тот же главный поток ждет сигнала destroyed(), например QObjectCleanupHandler(), который об этом никогда не узнает будучи ребенком другого потока. |