![]() |
|
![]() ![]() ![]() |
|
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
подправленный пример из tutorial (для наглядности):
Здесь при создании QPushButton устанавливается связь с QWidget передачей указателя на widget, в результате чего при уничтожении widget'a автоматически уничтожается quit. QWidget и QPushButton должны уничтожаться отдельно, как можно перед удалением объектов удалять их связь? -- зачем такое надо: у меня идёт автоматическое удаление созданных объектов, порядок уничтожения я определить не могу. Есть только возможность самому описать функцию уничтожения объекта DESTROY(), по-умолчанию в DESTROY написано delete объект; из-за чего при вызове DESTROY для QPushButton после DESTROY для QWidget программа завершается с "Ошибка сегментирования". Как вариант: возможно ли вообще имея указатель на объект определить жив ли объект (NULL прописать в указатель невозможно). |
|||
|
||||
JackYF |
|
||||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
просто так - нет, уже обсуждалось в общих вопросах. так в QT тоже, причём автоматически и без телодвижений... Добавлено через 1 минуту и 10 секунд кстати, говоря, ты здесь можешь и не создавать "связь":
А компонент ложить на форму с помощью layout'ов. |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
На чём оно основано? Каков принцип? В куте всё просто: есть парент, есть чайлды. Деструктор парента удаляет все чайлды. Можно явно для объекта вызвать setParent. Кстати, у тебя в итоге никто не удалиться. Нужно ызвать delete для widget или (что разумней) создать widget как стековый объект. Добавлено через 1 минуту и 2 секунды А вообще. setGeometry, setFixedSize - в 99% случаев есть зло. Ведь есть лэйоуты ![]() |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
Для каждого созданного объекта вызывется DESTROY, это делает сборщик мусора в автоматическом режиме, видя переменную с указателем на класс. Я выше написал, что это слегка подправленный пример из tutorial (Qt Tutorial 4 - Let There Be Widgets), чтоб не изобретать своего. Здесь мне надо было только показать связь между классами. С Qt я более-менее знаком. В том то и дело, что мне надо или увидеть что класс уже удалён или перед удалением удалять связи чтоб это автоматически не делал Qt |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
а почему не можешь всю эту "логику" удаления поместить в деструктор твоего класса?
|
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Сигнал destroyed? Пример:
|
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
вот у меня как раз 4й случай.
днём я для проверки закомментировал delete push_button и ошибки не возникло. Вот думаю может вызвать widget->children () и пройдя по списку QObjectList всем вызвать setParent(0); после чего уже и можно делать delete widget. Добавлено через 2 минуты и 24 секунды
код могу поместить и в DESTROY, и в деструктор, главное что туда помещать |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
||||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 7 Всего: 162 |
vadiml, ну тогда по сабжу ответ на вопрос уже дан:
Где хочешь, там и вызывай сию дребедень ![]() |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
подобавлял перед delete
тот пример, что я приводил -- сработал, а на более сложных -- всё равно вылетает. Плюс иногда DESTROY для QApplication вызывается раньше, чем удаляются виджеты. Да и с самим QApplication не всё чисто, например на одном примере на delete application выдало: X Error of failed request: RenderBadPicture (invalid Picture parameter) Major opcode of failed request: 152 (RENDER) Minor opcode of failed request: 7 (RenderFreePicture) Picture id in failed request: 0x2c00009 Serial number of failed request: 1227 Current serial number in output stream: 1248 видать хватает еще много скрытых связей, у того же QApplication на приводимом выше примере висит 4 потомка, 1 из которых тема графической оболочки. буду думать как такое отслеживать. |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Пожалуй, проще отказаться от своего GC
![]() У тебя что дефан THIS -> this? А зачем, |
|||
|
||||
vadiml |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
это не GC, а Perl XS,
вот синтаксис -- http://perldoc.perl.org/perlxs.html#Using-XS-With-C%2b%2b Добавлено через 4 минуты и 41 секунду т.е. я пищу
на основе чего Perl XS создает с-файл с такой функцией:
которая потом компилируется. Все макросы определены в perl.h |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
vadiml, я что-то не пойму, а, если вообще не объявлять этот DESTROY. Кутешные объекты очистятся автоматически. Тебе нужно что-то ещё?
|
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 11 Всего: 93 |
Сделай то же самое, только не для QWidget, а для QObject, ибо children может быть у любого класса, наследующегося от QObject.
Не все и не всегда - ты же сам писал про "сирот" ![]() -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
решил пока остановиться на таком варианте:
на небольших программах пока ошибок не вылазило. Кому-нибудь с таким грабли попадались? Добавлено через 8 минут и 43 секунды так же думаю стоит ли запретить явное удаление QApplication, т.к. всегда DESTROY для него вызывается в перемешку с остальными, в то же время его запросто может убрать сборщик мусора если он сам не удалиться |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
вот что сейчас получилось -- http://www.qt-apps.org/content/show.php/Pe...4?content=69748
хоть и не C++, но Qt4 ![]() ЗЫ нет еще вызовов виртуальных функций дочерних классов через родительские |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Перлом я никогда не пользовался - но молодец! Неплохая вещь. Если изначальный вопрос решён - отметь соответствующей галочкой. |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
частично
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, 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. |