crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

MishaUA
  опции профиля:
сообщение 5.6.2014, 2:36
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Есть QTabWidget. Создается объект, наследуемый от QWidget, и добавляется (addTab) на QTabWidget, нужно при закрытии программы в деструкторе забирать некоторые данные с QWidget. Проблема в том, что при закрытии проги деструктор вызывается после того, как QTabWidget удален, а следовательно, удален и QWidget, поэтому вызвать какой либо метод этого класса (QWidget) уже не получится.
Можно ли сделать так, чтобы при удалении QTabWidget, не удалялся (оставался в памяти и был доступен по указателю) этот QWidget?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 7)
Алексей1153
  опции профиля:
сообщение 5.6.2014, 8:27
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


нужный порядок удаления можно обеспечить на 100% , инкапсулировав дочерние виджеты в класс X, производный от QTabWidget

Тогда гарантированно удаление виджетов можно совершить в деструкторе класса X

Ещё вариант - перед удалением QTabWidget отвязать его родительство от виджетов вкладок ( вкладка->setParent(0) ) , но потом не забыть сами вкладки тоже удалить, а то будет утечка

Сообщение отредактировал Алексей1153 - 5.6.2014, 8:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 5.6.2014, 11:19
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Первый способ проблематичный, так как QTabWidget на форму кинул в дизайнере.
По поводу второго, он больше подходит. Но тут вопрос. Qwidget расположен на Qtabwidget, а он на QMainWindow, получается, порядок удаления такой:
1. Удаления дочерних компонентов qwidget, вызов деструктора qwidget.
2. Удаление табов qwidget, вызов деструктора QTabWidget.
3. Удаление QTabWidget, вызов деструктора QMainWindow.

Получается, что деструктор QTabWidget вызывается уже после удаления его табов (qwidget), соответственно, изменить родителей для qwidget уже не получится.
Если я где то туплю, подскажите, плиз, где? :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.6.2014, 12:25
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


MishaUA, давай начнём с постановки задачи лучше. Что происходит и какие данные должны "забираться" ? Просто у меня никогда описанной проблемы не возникало, поэтому надо разобраться, где что пошло не так ))

Возможно, данные или их копия всегда должны находиться вне виджета, тогда удаление виджета их не уничтожит

Сообщение отредактировал Алексей1153 - 5.6.2014, 12:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 5.6.2014, 12:56
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Возможно, данные или их копия всегда должны находиться вне виджета, тогда удаление виджета их не уничтожит

Я так всегда делал и оно нормально работало, но подумал, что как то оптимально.
Основная проблема в том, что этот виджет загружается с dll, вот и хотелось бы, чтобы в деструкторе библиотеки с виджета забирались некоторые данные.
Тогда сделаю как и раньше, да и так вроде правильней.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 5.6.2014, 15:07
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


и еще заинтересовал метод
Цитата
нужный порядок удаления можно обеспечить на 100% , инкапсулировав дочерние виджеты в класс X, производный от QTabWidget

Я не совсем понял, что такое инкапсуляция дочерних виджетов. Где можно об этом почитать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 5.6.2014, 15:45
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(MishaUA @ 5.6.2014, 3:36) Link
нужно при закрытии программы в деструкторе забирать некоторые данные с QWidget.

В деструкторе чего?
Может проще забирать эти данные в closeEvent формы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.6.2014, 19:38
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(MishaUA @ 5.6.2014, 14:19) Link
Первый способ проблематичный, так как QTabWidget на форму кинул в дизайнере.
совершенно не важно с помощью дизайнера ты его создал или в коде. Дизайнер это НЕволшебная сущность, uic сгенерит с его файла обычный код на Си++
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.8.2025, 20:16