Russian Qt Forum
Ноябрь 24, 2024, 20:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QMdiSubWindow запрет на удаление дочернего виджета  (Прочитано 5217 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Февраль 24, 2013, 23:06 »

Всем привет!
У меня имеется в программе дерево с элементами.
При нажатии на элемент появляется суб окно с виджетом, привязанным к нажатому элементу
Код:
mdiArea->addSubWindow(myWidget)->show();
Если я закрою суб окно и попытаюсь снова открыть его, то програма выдаст мне ошибку
Код:
Unhandled exception at 0x650f448f (QtGuid4.dll) in postprocessor.exe: 0xC0000005: Access violation reading location 0xfeeeff46.
Я так понимаю, что при закрытии суб окна у меня вычищается myWidget и снова его вывести на экран становится невозможным.
Я пробовал переопределить closeEvent у QMdiSubWindow и прописать там hide() и ignore(), но это не помогло, а только привело к тому, что окно закрывается, а таб из-под него остается и становится каким-то неактивным...
Как же мне решить эту проблему?
Записан
carrygun
Гость
« Ответ #1 : Февраль 25, 2013, 05:17 »

Попробовать покрутить Qt::WA_DeleteOnClose.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Февраль 25, 2013, 07:37 »

Попробовать покрутить Qt::WA_DeleteOnClose.
Не имел опыта работы с этой константой. Так что и не знаю, куда её приткнуть...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Февраль 25, 2013, 07:52 »

Попробовать покрутить Qt::WA_DeleteOnClose.
Попытался я что-либо сделать с этим атрибутом - получается бессмысленно.
По умолчанию Qt, на сколько я знаю, вычищает память при закрытии. А этот атрибут только форсирует очистку при закрытии неглавного виджета.
Записан
carrygun
Гость
« Ответ #4 : Февраль 25, 2013, 08:42 »

В документации по addSubWindow() написано с примером что и как делать.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Февраль 25, 2013, 10:55 »

В документации по addSubWindow() написано с примером что и как делать.
Ничего не помогло.
У меня организовано закрытие окон в табах а также в меню.
Изначально у меня было типа mdiArea->addSubWindow(myWidget)->show(); По сути, ничего удаляться из myWidget не должно при закрытии суб окна, так как при данном действии создается новое суб окно, родитель которого mdiArea и оно является вьюпортом myWidget и должно удаляться только само окно при закрытии, как я понял.
Теперь попробовал создать свое суб окно:
Код:
	QMdiSubWindow* win = new QMdiSubWindow;
win->setWidget(flats[selectedFlat]);
win->setAttribute(Qt::WA_DeleteOnClose);
mdiArea->addSubWindow(win)->show();
Это кусок кода из моей программы, где flats это QMap со значениями QWidget*. Я проверил, что при повторном запуске значения адресов не меняются.
Всё равно, данный код от проблемы не спас...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Февраль 25, 2013, 11:07 »

Решил вопрос костылём!
Сначала сделал код
Код:
void MdiSubWindow::closeEvent(QCloseEvent* event)
{
setWidget(0);
}
Но он привел к закрытию самого окна, но таб и экшн в меню для этого окна всё равно оставался и не отвечал на действия.
Затем добил
Код:
void MdiSubWindow::closeEvent(QCloseEvent* event)
{
setWidget(0);
mdiArea()->removeSubWindow(this);
}

Всё теперь работает как и было мне надо.

Возможно, это велосипед. Может быть был способ без создания наследованного класса от QMdiSubWindow? Жду продолжения развития темы.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Февраль 25, 2013, 11:42 »

Да, ещё в констукторе нужно прописать тот самый атрибут на удаление по закрытию, а то без него будет течь память.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.333 секунд. Запросов: 22.