Родитель виджета, не удаляющий дитёнка |
Здравствуйте, гость ( Вход | Регистрация )
Родитель виджета, не удаляющий дитёнка |
Litkevich Yuriy |
12.11.2010, 19:55
Сообщение
#11
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Алексей1153 |
12.11.2010, 20:11
Сообщение
#12
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
kwisp |
12.11.2010, 20:19
Сообщение
#13
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
не смущает? как раз и не должно. Унаследовался от QWidget и вперёд. Со спецификатором доступа public при наследовании все public и protected методы QWidget должны стать public и protected что ли методами наследника. в деструкторе вызывать УЖЕ поздно This function is usually called from the QWidget destructor. странно. почему-то не происходят. это вообще странно. может все таки ты где то ошибся. код давай. и по-моему даже если их поймаешь то будет поздно - т.к. деструкторы вызываются в обратном порядке вызова конструкторов. получается если сигнал вызывается перед деструктором QObject то вся виджетная часть уже удалена. |
|
|
Алексей1153 |
12.11.2010, 20:20
Сообщение
#14
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
kwisp |
12.11.2010, 20:22
Сообщение
#15
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
|
|
|
Алексей1153 |
12.11.2010, 20:23
Сообщение
#16
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
что не так ? |
|
|
kwisp |
12.11.2010, 20:37
Сообщение
#17
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
добавил в слот
void CWin::preventChildrenKilling(QObject*) std::cout << __PRETTY_FUNCTION__ << "\n"; при работе получил вывод Цитата ./test void CWin::preventChildrenKilling(QObject*) Ошибка сегментирования так что на сигнал destoyed() зря грешишь он вызывается и даже слот срабатывает можно попробовать через deleteLater() посмотреть в багрекере троллей баг на destroy твоей версии Qt --------- в деструкторе вызывать УЖЕ поздно, хотя ты знаешь все поддается логике. деструкторы вызываются в обратном порядке. ты к примеру используешь destroy в своем деструкторе .сначала вызывается в твоем destroy(true,false) а затемм - destroy(true,true) в деструкторе QWidget вполне возможно что второй раз детки погибают от рук попаши. |
|
|
panter_dsd |
12.11.2010, 20:52
Сообщение
#18
|
Жаждущий знаний Группа: Участник Сообщений: 254 Регистрация: 1.1.2009 Из: Санкт-Петербург Пользователь №: 474 Спасибо сказали: 32 раз(а) Репутация: 3 |
void QObject::destroyed ( QObject * obj = 0 ) [signal]
This signal is emitted immediately before the object obj is destroyed, and can not be blocked. All the objects's children are destroyed immediately after this signal is emitted. |
|
|
Алексей1153 |
12.11.2010, 21:06
Сообщение
#19
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
kwisp, только сейчас обратил внимание, что в консоли вывод
Цитата Object::connect: Attempt to bind non-signal CWin::destroyed() Object::connect: Attempt to bind non-signal CWin::destroyed(QObject*) определение в <qobject.h> Цитата Q_SIGNALS: void destroyed(QObject * = 0); - хм посмотреть в багрекере троллей баг на destroy твоей версии Qt это как делается ? и где попробовал вызывать deleteLater() вместо delete. Потом, попозже, по мышиному событию вызвал show для детей - тоже вылет. Похоже, остаётся только так что то типа:
void killWidgetWithoutChildren(QWidget* wgt) { foreach(wgt->children(), QObject* obj) if(obj->isWidget()) obj->reparent(NULL); delete wgt; } |
|
|
kwisp |
12.11.2010, 21:24
Сообщение
#20
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
Похоже, остаётся только так так точно только правда что то типа. я скоренько накатал рабочий вариант. завернешь в функцию сам.
без qobject_cast не работает. что очень интересно. а всё дело в setParent - их две в QObject и QWidget как делать со всеми кнопками и лейблами. не знаю на сколько корректно будет приводить их к QWidget* думаю прокатит т.к. они все его прямые public наследники |
|
|
Текстовая версия | Сейчас: 15.1.2025, 17:35 |