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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Закрыть виджет  (Прочитано 9010 раз)
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« : Март 04, 2013, 13:39 »

Хочу, чтобы при закрытии виджета mw закрывался и виджет tx
[cpp]  QWidget *mw = new QWidget();
  .....
  QTextEdit *tx = new QTextEdit();
  QObject::connect (mw, SIGNAL(destroyed(QObject *)), tx, SLOT(close()));
  QObject::connect (mw, SIGNAL(destroyed(QObject *)), tx, SLOT(deleteLater())); [/cpp]
Но почему-то этого не происходит...
Записан
alexis031182
Гость
« Ответ #1 : Март 04, 2013, 13:42 »

Код
C++ (Qt)
QTextEdit *tx = new QTextEdit(mw);
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #2 : Март 04, 2013, 13:50 »

Код
C++ (Qt)
QTextEdit *tx = new QTextEdit(mw);
Но тогда tx будет внутри mw, а мне этого совершенно не хочется. Дело в том, что mw - небольшой "управляющий" виджет, что-то вроде стартера. А tx хочется сделать побольше, там результаты просматриваются.
Похожая штука была у меня в случае, когда mw происходил от QDialog. тогда лечит [cpp]
   QObject::connect (mw, SIGNAL(finished(int)), tx, SLOT(close()));[/cpp]
Записан
alexis031182
Гость
« Ответ #3 : Март 04, 2013, 13:58 »

Ну тогда надо унаследоваться от QWidget и переопределить событие "closeEvent()". Естественно, что новоявленный класс должен будет иметь указатель на tx;
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #4 : Март 04, 2013, 14:14 »

Ну тогда надо унаследоваться от QWidget и переопределить событие "closeEvent()". Естественно, что новоявленный класс должен будет иметь указатель на tx;
Понятно. Дело немного усложняется тем, что может быть несколько экземпляров tx. Значит надо будет создавать не просто указатель на tx, а список указателей типа QList, следить за закрытиями этих экземпляров....
Если более простого решения не найдется, придется наследовать mw от диалога, что в общем-то логично...
Записан
alexis031182
Гость
« Ответ #5 : Март 04, 2013, 14:21 »

Можно QWidget унаследовать и в переопределённой closeEvent() отправлять свой сигнал о закрытии. Получится как с QDialog.
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #6 : Март 04, 2013, 14:26 »

Спасибо! Похоже, это оптимальный вариант.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #7 : Март 04, 2013, 14:27 »

Не надо наследоваться. Поставь после создания виджета это:
Код:
mw->setAttribute(Qt::WA_DeleteOnClose, true);
соединять с deleteLater необязательно. И не забудь для QApplication указать setQuitOnLastWindowClosed(true)
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #8 : Март 04, 2013, 19:24 »

И вам спасибо! Теперь надо выбрать из всех оптимальных вариантов самый оптимальный. Подмигивающий
Странно, что для такой в общем-то несложной штуки, требуется привлечение не самых очевидных способов.
Но я - не в обиде. Вот еще я узнал пару кустов и лиан в джунглях Qt Улыбающийся
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #9 : Март 04, 2013, 19:29 »

Цитировать
соединять с deleteLater необязательно.
Это уж я так, для полноты картинки. Первоначальный вариант был с close()
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #10 : Март 04, 2013, 19:49 »

Странно, что для такой в общем-то несложной штуки, требуется привлечение не самых очевидных способов.
При закрытии виджета происходит его скрытие, а удалять (если не выставлен тот самый атрибут, который не выставлен по умолчанию) надо явно через delete. Поэтому в твоем коде сигнал destroyed не высылался и, соответственно, не вызывался слот закрытия другого окна. По этой же причине надо устанавливать setQuitOnLastWindowClosed(true), в противном случае приложение будет висеть невидимым.
По архитектуре приложения - может стоит попробовать QMdiArea?
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #11 : Март 04, 2013, 20:04 »

Еще раз спасибо за подробные объяснения.
Цитировать
По архитектуре приложения - может стоит попробовать QMdiArea?
Это я с удовольствием использую в другом проекте, там тоже куча заморочек, буду разбираться потихонечку... Но в данном случае оно того не стоит.
Тут конечно, хотелось бы понять механизмы... А они не всегда очевидны. Документация тут много не дает. Она дает перечень методов, но их взаимодействие остается в тайне. Вот такие разборки нас немного приближают к пониманию. Как говаривала одна моя знакомая: "Все приходит с опытом. Но опыт приходит поздно."
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #12 : Март 05, 2013, 11:49 »

Hellraiser, Все получилось, хотя и не сразу. Дело в том, что после app->exec() у меня еще стояли всякие манипуляции (снятие и запись настроек), которые приводили к ошибке. Перекинул все это хозяйство в деструктор - все заработало
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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