![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
MishaUA |
![]()
Сообщение
#1
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
Есть QTabWidget. Создается объект, наследуемый от QWidget, и добавляется (addTab) на QTabWidget, нужно при закрытии программы в деструкторе забирать некоторые данные с QWidget. Проблема в том, что при закрытии проги деструктор вызывается после того, как QTabWidget удален, а следовательно, удален и QWidget, поэтому вызвать какой либо метод этого класса (QWidget) уже не получится.
Можно ли сделать так, чтобы при удалении QTabWidget, не удалялся (оставался в памяти и был доступен по указателю) этот QWidget? |
|
|
![]() |
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
нужный порядок удаления можно обеспечить на 100% , инкапсулировав дочерние виджеты в класс X, производный от QTabWidget
Тогда гарантированно удаление виджетов можно совершить в деструкторе класса X Ещё вариант - перед удалением QTabWidget отвязать его родительство от виджетов вкладок ( вкладка->setParent(0) ) , но потом не забыть сами вкладки тоже удалить, а то будет утечка Сообщение отредактировал Алексей1153 - 5.6.2014, 8:30 |
|
|
MishaUA |
![]()
Сообщение
#3
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
Первый способ проблематичный, так как QTabWidget на форму кинул в дизайнере.
По поводу второго, он больше подходит. Но тут вопрос. Qwidget расположен на Qtabwidget, а он на QMainWindow, получается, порядок удаления такой: 1. Удаления дочерних компонентов qwidget, вызов деструктора qwidget. 2. Удаление табов qwidget, вызов деструктора QTabWidget. 3. Удаление QTabWidget, вызов деструктора QMainWindow. Получается, что деструктор QTabWidget вызывается уже после удаления его табов (qwidget), соответственно, изменить родителей для qwidget уже не получится. Если я где то туплю, подскажите, плиз, где? ![]() |
|
|
Алексей1153 |
![]()
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
MishaUA, давай начнём с постановки задачи лучше. Что происходит и какие данные должны "забираться" ? Просто у меня никогда описанной проблемы не возникало, поэтому надо разобраться, где что пошло не так ))
Возможно, данные или их копия всегда должны находиться вне виджета, тогда удаление виджета их не уничтожит Сообщение отредактировал Алексей1153 - 5.6.2014, 12:27 |
|
|
MishaUA |
![]()
Сообщение
#5
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
Я так всегда делал и оно нормально работало, но подумал, что как то оптимально. Основная проблема в том, что этот виджет загружается с dll, вот и хотелось бы, чтобы в деструкторе библиотеки с виджета забирались некоторые данные. Тогда сделаю как и раньше, да и так вроде правильней. |
|
|
MishaUA |
![]()
Сообщение
#6
|
Участник ![]() ![]() Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: ![]() ![]() ![]() |
и еще заинтересовал метод
Цитата нужный порядок удаления можно обеспечить на 100% , инкапсулировав дочерние виджеты в класс X, производный от QTabWidget Я не совсем понял, что такое инкапсуляция дочерних виджетов. Где можно об этом почитать? |
|
|
Sokoloff |
![]()
Сообщение
#7
|
Участник ![]() ![]() Группа: Участник Сообщений: 237 Регистрация: 1.4.2009 Из: Москва Пользователь №: 654 Спасибо сказали: 50 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(MishaUA @ 5.6.2014, 3:36) Link нужно при закрытии программы в деструкторе забирать некоторые данные с QWidget. В деструкторе чего? Может проще забирать эти данные в closeEvent формы? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(MishaUA @ 5.6.2014, 14:19) Link Первый способ проблематичный, так как QTabWidget на форму кинул в дизайнере. совершенно не важно с помощью дизайнера ты его создал или в коде. Дизайнер это НЕволшебная сущность, uic сгенерит с его файла обычный код на Си++
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 13.8.2025, 20:16 |