Название: проблемы с удалением немодальных окон Отправлено: antipart от Ноябрь 27, 2007, 20:48 Проблема в следующем:
Есть главное окно QMainWindow, в котором динамически создается немодальное окно в таком виде: QMainWindow *window; - является члено класса window=0; - инициируется в конструкторе главного окна далее в одной из функций создается само окно window =new QMainWindow(this); Теперь если закрыть главное окно приложения дочернее не убивается - вопрос почему? Везде написано, что за уничтожение потомков отвечат предок! w->setAttribute(Qt::WA_DeleteOnClose); для главного окна не устраивает т.к визуально все работает отлично(все заекрывается) , а приложение висит в памяти... Пока остановился на таком решении: Код: void BaseForm::Quit() Если кто сталкивался с подобным, подскажите, плз... Название: Re: проблемы с удалением немодальных окон Отправлено: Dodge от Ноябрь 27, 2007, 23:19 Охренеть... вызов метода объекта, после его удаления, причем внутри самого объекта...
...или я не так понял? Название: Re: проблемы с удалением немодальных окон Отправлено: antipart от Ноябрь 27, 2007, 23:36 Да , не так понял...
Удаляется динамически созданное окно при выходе из главного окна... хотя по идее это должно делаться автоматически... как со всеми динамическими виджетами потомками (кнопками , таблицами)... мы же их не удаляем вручную... а здесь приходится... вот я и не пойму почему... Название: Re: проблемы с удалением немодальных окон Отправлено: Dodge от Ноябрь 28, 2007, 00:25 Всеравно не срвсем понятно в чем дело... вообще, если хотите по закрытию главного окна, закрывать программу, то можно вызывать метод quit а объекта QApplication.
Возможно я не туда смотрю, но пожалуйста выложите код создания главного окна, и его чилдов. Будет наглядней. Название: Re: проблемы с удалением немодальных окон Отправлено: antipart от Ноябрь 28, 2007, 02:28 mainform.h
Код: #ifndef MAINFORM_H mainform.cpp Код: BaseForm::BaseForm(QWidget *parent): QMainWindow(parent) Название: Re: проблемы с удалением немодальных окон Отправлено: antipart от Ноябрь 28, 2007, 02:32 забыл main.cpp
Код: int main(int argc, char *argv[]) Название: Re: проблемы с удалением немодальных окон Отправлено: Tonal от Ноябрь 28, 2007, 11:19 В Qt "главных" окон может быть сколько угодно.
Которое из твоих главнее системе не ясно. Так что всё правильно. Если хочешь, чтобы при закрытии w (экземпляра BaseForm) закрывалось и window - закрывай его руками, или установи для w атрибут WA_DeleteOnClose Название: Re: проблемы с удалением немодальных окон Отправлено: Lion от Ноябрь 28, 2007, 16:08 Если QMainWindow отображается в виде отдельного окна, то у него parent() == NULL, иначе это окно обображалось бы внутри BaseForm.
Название: Re: проблемы с удалением немодальных окон Отправлено: fanat9 от Ноябрь 28, 2007, 16:46 Примеры ведут себя так же.
Посмотрите например \examples\widgets\stylesheet. Там диалог(QDialog) StyleEditor'а не закрывается с закрытием главного окна, хотя является его child'ом, что указано явно при его инициализации: styleSheetEditor = new StyleSheetEditor(this); Кто-нибудь может объяснить механизм почему так происходит ? При closeEvent'e пробегаться по списку и удалять всех возможных потомков можно, но не красиво - можно про кого-нибудь забыть. Особенно в случае, если у потомков тоже есть немодальные диалоги. Сам не сталкивался, но imho стоит внимательнее смотреть в сторону флагов на автоматическое удаление. Название: Re: проблемы с удалением немодальных окон Отправлено: ритт от Ноябрь 28, 2007, 16:59 лион, -1
не поленись доказать своё утверждение фанат, как будет свободное время, почитаю сорцы - объясню "механизм почему так происходит" сейчас не до этого Название: Re: проблемы с удалением немодальных окон Отправлено: pastor от Ноябрь 28, 2007, 17:49 Есть ещё такой вот метод QApplication::closeAllWindows() который:
Цитировать Closes all top-level windows. This function is particularly useful for applications with many top-level windows. It could, for example, be connected to a Exit entry in the File menu Название: Re: проблемы с удалением немодальных окон Отправлено: pastor от Ноябрь 28, 2007, 17:52 Если QMainWindow отображается в виде отдельного окна, то у него parent() == NULL, иначе это окно обображалось бы внутри BaseForm. Серьёзно? Название: Re: проблемы с удалением немодальных окон Отправлено: Dodge от Ноябрь 28, 2007, 20:00 Примеры ведут себя так же. Что за ерунда?... закрытие окна не означает его удаление.Посмотрите например \examples\widgets\stylesheet. Там диалог(QDialog) StyleEditor'а не закрывается с закрытием главного окна, хотя является его child'ом, что указано явно при его инициализации: styleSheetEditor = new StyleSheetEditor(this); Кто-нибудь может объяснить механизм почему так происходит ? При closeEvent'e пробегаться по списку и удалять всех возможных потомков можно, но не красиво - можно про кого-нибудь забыть. Особенно в случае, если у потомков тоже есть немодальные диалоги. Сам не сталкивался, но imho стоит внимательнее смотреть в сторону флагов на автоматическое удаление. Если надо завершить программу при закрытии какого либо окна, то вешаем на его событие - closeEvent метод QApplication quit. Название: Re: проблемы с удалением немодальных окон Отправлено: fanat9 от Ноябрь 28, 2007, 21:29 Цитировать Что за ерунда?... закрытие окна не означает его удаление. Сам понял чего написал ? Закрытие какого окна не означает его удаление ? Название: Re: проблемы с удалением немодальных окон Отправлено: pastor от Ноябрь 28, 2007, 21:41 Закрытие какого окна не означает его удаление ? Любого. Даже если окно закрываеть, сам объект не удаляеться (заисключением ситуации, когда установлен аттрибут Qt::WA_DeleteOnClose). Окно просто хайдиться. Учим мат часть! Название: Re: проблемы с удалением немодальных окон Отправлено: fanat9 от Ноябрь 28, 2007, 22:01 И за исключением когда закрывается последнее окно и возможно ещё в нескольких ситуациях. Я собственно и имел это ввиду - просто не понравилась фраза: "закрытие окна не означает его удаление" - иногда означает.
Название: Re: проблемы с удалением немодальных окон Отправлено: pastor от Ноябрь 28, 2007, 22:22 И за исключением когда закрывается последнее окно... Снова заблуждение! Для простоты возмем одно единственное окно. Если окно создано динамически, и аттрибут Qt::WA_DeleteOnClose отсутствует то после его закрытия программа завершается, но сам объект не удаляеться! Полное освобождение ресурсов происходит когда окно создано в стеке или удалено явно после завершения приложения. ...и возможно ещё в нескольких ситуациях В каких ситуациях? Поделитесь информацией с остальными, не жадничайте ;) Название: Re: проблемы с удалением немодальных окон Отправлено: fanat9 от Ноябрь 28, 2007, 22:35 Цитировать Снова заблуждение! Для простоты возмем одно единственное окно. Если окно создано динамически, и аттрибут Qt::WA_DeleteOnClose отсутствует то после его закрытия программа завершается, но сам объект не удаляеться! Полное освобождение ресурсов происходит когда окно создано в стеке или удалено явно после завершения приложения. А если нет ? И пример такой можно чтобы мне разобраться до конца ? Цитировать В каких ситуациях? Поделитесь информацией с остальными, не жадничайте А например когда closeEvent() переопределен, вот ;DНазвание: Re: проблемы с удалением немодальных окон Отправлено: pastor от Ноябрь 28, 2007, 22:48 А если нет ? И пример такой можно чтобы мне разобраться до конца ? Помоему вы сами можете написать этот пример, или нет? Название: Re: проблемы с удалением немодальных окон Отправлено: Dodge от Ноябрь 28, 2007, 22:58 Помоему вы сами можете написать этот пример, или нет? Просто человек не знает о чем говорит.На самом деле есть некоторые проблемы с автоматическим удалением окон(если угодно объектов QWidget и их наследников), если не использовать Qt::WA_DeleteOnClose. Я в свое время прибывал в некотором недоумении, когда например deleteLater() в переопределенном методе closeEvent виджета, приводило к падению программы. Версию qt точно не скажу, но возможно даже в 4.3.0. Есть некоторые моменты при работе с виждетами, которые я не понимаю или не знаю. Обычно в таких ситуациях я не разбираюсь в чем проблема, а нахожу альтернативный способ ее решить, ибо времени жалко. Название: Re: проблемы с удалением немодальных окон Отправлено: pastor от Ноябрь 28, 2007, 23:02 Просто человек не знает о чем говорит. 2 Dodge: А кому адресован этот пост, мне или fanat9? Название: Re: проблемы с удалением немодальных окон Отправлено: Dodge от Ноябрь 28, 2007, 23:04 2 Dodge: А кому адресован этот пост, мне или fanat9? fanat9 естесно...Название: Re: проблемы с удалением немодальных окон Отправлено: Lion от Ноябрь 29, 2007, 07:50 Если QMainWindow отображается в виде отдельного окна, то у него parent() == NULL, иначе это окно обображалось бы внутри BaseForm. Серьёзно? Название: Re: проблемы с удалением немодальных окон Отправлено: ритт от Ноябрь 29, 2007, 09:00 хм...интересно какое это правило? когда мэйнвиндов создаётся из главной функции и ни одного виджета ещё не существует, чтобы поставить его родителем окну?
охренеть, правило...скорее уж, нужда. Название: Re: проблемы с удалением немодальных окон Отправлено: antipart от Ноябрь 29, 2007, 20:20 Цитировать Снова заблуждение! Для простоты возмем одно единственное окно. Если окно создано динамически, и аттрибут Qt::WA_DeleteOnClose отсутствует то после его закрытия программа завершается, но сам объект не удаляеться! так этот атрибут (Qt::WA_DeleteOnClose) нужно для каждого динамического окна указывать?пробовал указывать только для главного окна и мне не очень понравился результат...-все окна закрываются (вроде как положено) , но приложение висит в задачах... в моем случае (окон не много) получилось нормально выйти только при помощи delete потомка при закрытии предка... Название: Re: проблемы с удалением немодальных окон Отправлено: Вячеслав от Ноябрь 29, 2007, 20:40 Цитировать Снова заблуждение! Для простоты возмем одно единственное окно. Если окно создано динамически, и аттрибут Qt::WA_DeleteOnClose отсутствует то после его закрытия программа завершается, но сам объект не удаляеться! так этот атрибут (Qt::WA_DeleteOnClose) нужно для каждого динамического окна указывать?пробовал указывать только для главного окна и мне не очень понравился результат...-все окна закрываются (вроде как положено) , но приложение висит в задачах... в моем случае (окон не много) получилось нормально выйти только при помощи delete потомка при закрытии предка... Название: Re: проблемы с удалением немодальных окон Отправлено: pastor от Ноябрь 29, 2007, 20:45 так этот атрибут (Qt::WA_DeleteOnClose) нужно для каждого динамического окна указывать? пробовал указывать только для главного окна и мне не очень понравился результат...-все окна закрываются (вроде как положено) , но приложение висит в задачах... в моем случае (окон не много) получилось нормально выйти только при помощи delete потомка при закрытии предка... Нет, не для каждого. Я говрил про главное окно приложения. Когда оно создаеться динамически (при этом парента нет) окно не удаляеться. Qt::WA_DeleteOnClose решает эту проблему. В вашем случае создаеться второе главное окно. Его нужно удалять или явно или задавать аттрибут Qt::WA_DeleteOnClose и вызывать close() Название: Re: проблемы с удалением немодальных окон Отправлено: pastor от Ноябрь 29, 2007, 20:49 Чего-то меня стали сомнения терзать - ты случаем quitOnLastWindowClosed у QApplication'a не трогал ? Сигнал lastWindowClosed () ловиться ? Всетаки IMHO ты чего-то с родителями намудрил - у меня в SDI варианте проги создаеться туева хуча окон - а опосля нормально убиваются с завершением приложения ..... Все верное. Для каждого окна задан аттрибут Qt::WA_DeleteOnClose и при выходе из приложение вызываетсья closeAllWindows() etc. При этом происходит удаление всех окон и прога заверщает свою работу. У antipart другой случай. Для вторго главного окна этот атрибут не задан, и при close не происходит его удаления. Окно просто хайдиться. В результате прога не завершае тсвою работу Название: Re: проблемы с удалением немодальных окон Отправлено: Вячеслав от Ноябрь 29, 2007, 20:52 Гы ;) А позвать dumpObjectTree () от qApp'a не судьба ? и посмотреть хто остался жив ?
Название: Re: проблемы с удалением немодальных окон Отправлено: pastor от Ноябрь 29, 2007, 21:38 Гы ;) А позвать dumpObjectTree () от qApp'a не судьба ? и посмотреть хто остался жив ? ))) Ну помоему и без dumpObjectTree() ясно кто весит Название: Re: проблемы с удалением немодальных окон Отправлено: Racheengel от Декабрь 01, 2007, 13:20 хм...интересно какое это правило? когда мэйнвиндов создаётся из главной функции и ни одного виджета ещё не существует, чтобы поставить его родителем окну? охренеть, правило...скорее уж, нужда. Я так понимаю, что имелся в виду тот факт, что создание виджета с parent=0 в конструкторе (или при setParent) выпихивает его в отдельное окно. А по сути - надо либо parent для окна-самоубийцы указывать, либо руками прибивать в деструкторе главного окна. Название: Re: проблемы с удалением немодальных окон Отправлено: Racheengel от Декабрь 01, 2007, 13:24 Кстати, а про QApplication::setActiveWindow() не думали?
Название: Re: проблемы с удалением немодальных окон Отправлено: Racheengel от Декабрь 01, 2007, 13:25 Охренеть, йа-джедай...
Название: Re: проблемы с удалением немодальных окон Отправлено: ритт от Декабрь 01, 2007, 15:09 ну, по три мессага подряд - так и становятся джедаями :)
Название: Re: проблемы с удалением немодальных окон Отправлено: aljeshishe от Январь 13, 2010, 18:35 Кстати, а про QApplication::setActiveWindow() не думали? Код: Sets the active window to the active widget in response to a system event |