Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: vizir.vs от Декабрь 04, 2013, 09:13



Название: Закрытие QMessageBox при закрытии родителя.
Отправлено: 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 тоже закрывался?


Название: Re: Закрытие QMessageBox при закрытии родителя.
Отправлено: Fregloin от Декабрь 04, 2013, 11:44
думаю есть смысл связать сигнал родителя destroyed со слотом close вашего меседжбокса как вариант, перед отображением


Название: Re: Закрытие QMessageBox при закрытии родителя.
Отправлено: kambala от Декабрь 04, 2013, 11:53
разве QMessageBox не блокирует все окна приложения? или тут особый QMessageBox с модальностью не ApplicationModal?


Название: Re: Закрытие QMessageBox при закрытии родителя.
Отправлено: carrygun от Декабрь 04, 2013, 12:35
разве QMessageBox не блокирует все окна приложения? или тут особый QMessageBox с модальностью не ApplicationModal?

Судя по примеру - родителя закрывают программно. Я, если четсно, никогда не пробовал так делать.


Название: Re: Закрытие QMessageBox при закрытии родителя.
Отправлено: vizir.vs от Декабрь 04, 2013, 12:37
разве QMessageBox не блокирует все окна приложения? или тут особый QMessageBox с модальностью не ApplicationModal?

Дело в том, что у меня идет какой-то процесс, заданной длительностью. Пользователь может его отменить, и тогда появится QMessageBox с вопросом: "вы уверены?". Пока вопрос весит, процесс может уже закончится и закрыть окно, в котором оно выполнялось. Необходимо, что QMessageBox закрывалось за ним. Я полагал, что при закрытии родителя, дочернее окно QMessageBox тоже закроется, но это не сработало.


Название: Re: Закрытие QMessageBox при закрытии родителя.
Отправлено: vizir.vs от Декабрь 04, 2013, 13:41
думаю есть смысл связать сигнал родителя destroyed со слотом close вашего меседжбокса как вариант, перед отображением

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


Название: Re: Закрытие QMessageBox при закрытии родителя.
Отправлено: Hellraiser от Декабрь 04, 2013, 15:27
Для удаления, а не сокрытия, виджета ставим атрибут:
Код
C++ (Qt)
setAttribute(Qt::WA_DeleteOnClose);


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

Это да, но у меня есть виджеты, которые скрыты, но на них приходят данные, поэтому я их не закрываю, а скрываю.


Название: Re: Закрытие QMessageBox при закрытии родителя.
Отправлено: Hellraiser от Декабрь 04, 2013, 15:47
Этот атрибут надо ставить не на все виджеты, а только для нужного. Можно в конструкторе, можно и в месте создания этого виджета.


Название: Re: Закрытие QMessageBox при закрытии родителя.
Отправлено: vizir.vs от Декабрь 05, 2013, 09:31
В общем пока сделал временное решение - обработка сигнала finished(int).