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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Закрытие QMessageBox при закрытии родителя.  (Прочитано 6049 раз)
vizir.vs
Гость
« : Декабрь 04, 2013, 09:13 »

У меня есть родительский виджет, в которым вызывается QMessageBox. При закрытие виджета, QMessageBox продолжает висеть, хотя я указал ему родителя.
Код:
this->showFullScreen();
QTimer::singleShot(5000, this, SLOT(close()));
QMessageQuestion(this, tr("test"), tr("test"), QMessageBox::Yes, QMessageBox::No));

Как сделать так, чтобы при закрытии родителя, QMessageBox тоже закрывался?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Декабрь 04, 2013, 11:44 »

думаю есть смысл связать сигнал родителя destroyed со слотом close вашего меседжбокса как вариант, перед отображением
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #2 : Декабрь 04, 2013, 11:53 »

разве QMessageBox не блокирует все окна приложения? или тут особый QMessageBox с модальностью не ApplicationModal?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
carrygun
Гость
« Ответ #3 : Декабрь 04, 2013, 12:35 »

разве QMessageBox не блокирует все окна приложения? или тут особый QMessageBox с модальностью не ApplicationModal?

Судя по примеру - родителя закрывают программно. Я, если четсно, никогда не пробовал так делать.
Записан
vizir.vs
Гость
« Ответ #4 : Декабрь 04, 2013, 12:37 »

разве QMessageBox не блокирует все окна приложения? или тут особый QMessageBox с модальностью не ApplicationModal?

Дело в том, что у меня идет какой-то процесс, заданной длительностью. Пользователь может его отменить, и тогда появится QMessageBox с вопросом: "вы уверены?". Пока вопрос весит, процесс может уже закончится и закрыть окно, в котором оно выполнялось. Необходимо, что QMessageBox закрывалось за ним. Я полагал, что при закрытии родителя, дочернее окно QMessageBox тоже закроется, но это не сработало.
Записан
vizir.vs
Гость
« Ответ #5 : Декабрь 04, 2013, 13:41 »

думаю есть смысл связать сигнал родителя destroyed со слотом close вашего меседжбокса как вариант, перед отображением

проблема в том, что виджет/диалог не закрывается, а скрываются (hide(), close()). В итоге виджет/диалог не удаляется, а как следствие сигнал destroy не шлется. Для диалогов можно связать сигнал finished и закрытие окна. А для виджетов я пока вижу только одну идею, переопределить closeEvent и самому слать какой нибудь сигнал, который бы я обрабатывал. Может кто знает альтернативный путь? Не хотелось бы переопределять closeEvent, тогда придется добавлять лишний уровень абстракции, в котором бы этот closeEvent и сигнал были бы определены.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #6 : Декабрь 04, 2013, 15:27 »

Для удаления, а не сокрытия, виджета ставим атрибут:
Код
C++ (Qt)
setAttribute(Qt::WA_DeleteOnClose);
Записан
vizir.vs
Гость
« Ответ #7 : Декабрь 04, 2013, 15:39 »

Для удаления, а не сокрытия, виджета ставим атрибут:
Код
C++ (Qt)
setAttribute(Qt::WA_DeleteOnClose);

Это да, но у меня есть виджеты, которые скрыты, но на них приходят данные, поэтому я их не закрываю, а скрываю.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #8 : Декабрь 04, 2013, 15:47 »

Этот атрибут надо ставить не на все виджеты, а только для нужного. Можно в конструкторе, можно и в месте создания этого виджета.
Записан
vizir.vs
Гость
« Ответ #9 : Декабрь 05, 2013, 09:31 »

В общем пока сделал временное решение - обработка сигнала finished(int).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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