![]() |
|
![]() ![]() ![]() |
|
chesterfielda |
|
||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
Доброго времени суток!!!
Я еще совсем новичок в Qt, поэтому прошу помощи ![]() У меня такая проблема: Есть три класса с формами:С1,С2 и С3. Из С1 посредством слота вызывается С2, а из С2 также по слоту вызывается С3 Все эти классы создаются динамически, т.е. С1 *с=new C1(parent); c->show(); И вот я хочу чтобы при закрытии самого основного первого класса С1, закрывались все дочерние существующие классы....для этого я в конструкторе класса С1 задаю: this->setAttribute(Qt::WA_DeleteOnClose); все вроде получается, все закрывается, только вот память не освобождается....видимо, потому что у меня в деструкторе ничего не прописано....А что там прописать точно и не знаю ![]() Вот пример: класс С1
класс С2
класс С3 аналогичный |
||||
|
|||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
||||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
В процессах приложение остается....
И не компилится, типо приложение открыто |
|||
|
||||
ufna |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.4.2005 Где: Курган/СПб Репутация: нет Всего: 0 |
ну дак все правильно. Смотри сам - дочерние виджеты вызваны динамические, класс-родитель имеет только указатель на них. При удалении объекта этого класса при закрытии окна - удаляются указатели, а не сами объекты. Тут несколько вариантов:
1. лови QCloseEvent 2. сделай деструктор, где будешь убивать эти объекты. |
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
Вот и я думаю, что нужно так сделать...только вот не знаю как правильно, вот смотрите:
Если я в деструкторе класса C1 напишу delete c;, то это не правильно т.к. если не будет вызван слот lpu(), то и не будет создана эта вторая форма и выскакивает соответственно ошибка ((( т.е. нужно определить был ли с создан сначало.... или в классе С2 в деструкторе написать delete this;, только вот не знаю на сколько это корректно , или даже если только в деструкторе С1 напишу delete this, то тоже все работает, правда не понимаю почему, я ведь удаляю только текущий объект Подскажите пожалуйста новичку как лучше сделать, чтобы потом глюков не было Да, и еще...а если я напишу не delete c;, с->close() это не одно и тоже будет?? |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
При удалении (delete) C1 все дочерние окна должны удаляться автоматически, если их родитель C1. При аттрибуте WA_DeleteOnClose, если закрывать C1 через крестик, то должно удалиться и C1 окно и все его дети. Когда все окна будут удалены/закрыты должен произойти выход программы, т.е. флаг QuitOnLastWindowClosed стоит по-умолчанию. Если этого не происходит, значит где-то косяк.
|
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
Значит,если в главном классе С1 установлен атрибут WA_DeleteOnClose,то дочтаточно только в деструкторе этого класса написать delete this, а в деструкторах дочерних классов ничего не удалять???
|
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
Или вообще ничего удалять не нужно, если установлен Qt::WA_DeleteOnClose????Поидее же этот атрибут означает, что при закрытии все должно удалится...
|
|||
|
||||
ufna |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.4.2005 Где: Курган/СПб Репутация: нет Всего: 0 |
кинь в личку исходники, гляну в чем там дело.
c->close() и delete© - асбсолютно разные вещи. Первое- функция, которая много что внутри делает, а второе - непосредственное прямое удаление объекта класса, это уже к С++ напрямую. Этот атрибут говорит о том, что при закрытии окна происходит еще и его удаление, ничего в деструктор насчет самого этого окна добавлять не нужно, оно удаляется средствами Qt. |
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
ufna, я вам отправила...
|
|||
|
||||
ufna |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.4.2005 Где: Курган/СПб Репутация: нет Всего: 0 |
пока ничего не получил
![]() |
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
ufna,я вам еще разочек отправила...
После многочисленных экспериментов вот что получается: 1.Если в деструкторе вторго класса, который вызывается из первого написать какое-нибудь сообщение , наприер QMessageBox::information(0,"деструктор","класса С2"); то приложение удаляется из процессов 2.Если в деструкторе первого класса,из которго вызывается второй написать if(c->isVisible()) c->close();, то тоже все удаляется из процессов 2-е конечно понятно, а вот по-поводу 1-го вообще не понимаю :(( И как лучше сделать тогда |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Напиши минимальный пример, который можно будет собрать на любой машине и прикрепи к посту.
|
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
Выкладываю самый простенький пример....
Не ругайте сильно, если ошибка элементарная ![]() Присоединённый файл ( Кол-во скачиваний: 8 ) ![]() |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
У меня в процессах ничего не остается, программа завершается корректно (Qt 4.5.2). Возможно проблема в версии Qt.
|
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
т.е. когда открыты две формы, а вы закрываете только первую у Вас все корректно работает???
У меня версия 4.3.3 Это сообщение отредактировал(а) chesterfielda - 14.7.2009, 14:11 |
|||
|
||||
ufna |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.4.2005 Где: Курган/СПб Репутация: нет Всего: 0 |
да, пример собирается и отлично работает, т.е. закрывается как надо.
Попробуй полностью пересобрать проект. Кстати, какую версию Qt и какой компилятор/IDE используешь? |
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
Версия Qt 4.3.3, а компилятор MinGW...
Вот блин, почему же так...у меня в моей проге тоже самое и вот простенькую сделала-тоже самое, поэтому пересборка сдеся не поможет... Все окошки закрываются, а экзешник остается в процессах..И что самое странное,если в деструкторе дочернего класса doch, раскомментировать вывод сообщения, то псле закрытия главного окна выводится это сообщение и закрывается дочернее окно и из процессо экзешник удаляется...вот почему интересно так?? |
|||
|
||||
ufna |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.4.2005 Где: Курган/СПб Репутация: нет Всего: 0 |
загрузи весь код сюда в форум, мне так ничего и не пришло пока что. И перекомпилировать все-таки попробуй
![]() |
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
В моем приложении абсолютно таже проблема, только кода больше...
|
|||
|
||||
ufna |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.4.2005 Где: Курган/СПб Репутация: нет Всего: 0 |
Может стоит обновить версию заодно?
Тут путь самый простой такой - очищать все наделанные компилятором файлы, и компилить сначала. Ошибка скорее всго не в коде, а в настройках. |
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
ну неужели все от версии зависит...
![]() Вот сейчас дома пересобрала,выложенный сдесь пример - таже проблема... Давайте я вам свой экзешник выложу и вы посмотрите.... Присоединённый файл ( Кол-во скачиваний: 7 ) ![]() |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Ты и Evgeniya одно и то же лицо?
Запустил .exe'шник со своими библиотеками Qt проблем не наблюдается. Значит дело в Qt, которые ты используешь. Это сообщение отредактировал(а) SABROG - 14.7.2009, 16:35 |
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
ну да...
![]() |
|||
|
||||
ufna |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 4.4.2005 Где: Курган/СПб Репутация: нет Всего: 0 |
то же самое. |
|||
|
||||
chesterfielda |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 13.7.2009 Репутация: нет Всего: нет |
А если я в деструкторе класса main_form пишу:
то все работает....уж не знаю на сколько это правильно |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |