Russian Qt Forum

Qt => Qt Quick => Тема начата: xintrea от Сентябрь 30, 2022, 15:58



Название: QML - последовательность вызовов onAccepted(), onRejected(), onClose().
Отправлено: xintrea от Сентябрь 30, 2022, 15:58
Сделал окошечко на базе Dialog, сделал две кнопки [OK] и [Cancel] плюс  в уголку кнопка закрытия [X].

[OK] - вызывает accept()
[Cancel] - вызывает reject()
[X] - вызывает close()

И, естественно, прописал диалогу обработчики:
Код:
onAccepted() { ... Действие 1 ... }
onRejected() { ... Действие 2 ... }
onClose() { ... Действие 3 ... }

Проблема в том, что если нажать OK или Cancel, то вначале QML сгенерирует вызов onClose(), и только потом onAccepted() или onRejected().

Получается, что хочу я того или не хочу, при нажатии OK будет выполнено:

Действие 3
Действие 1

А при нажатии Cancel будет выполнено:

Действие 3
Действие 2

Но в моей программе важна последовательность действий. И мне нужно, в идеале, как-то сделать, чтобы при нажатии OK или Cancel срабатывал только тот код, который написан в их обработчике.

Если это невозможно, то хотя бы сделать так, чтобы для ОК выполнялось:

Действие 1
Действие 3

А для Cancel выполнялось:

Действие 1
Действие 2

Как этого добиться?

Другими словами: в onClose() надо каким-то образом узнать, это «чистое» закрытие окна, или закрытие через кнопку OK/Close. И дело усложняется тем, что onClose() вызывается ПЕРЕД onAccepted()/onRejected(), то есть невозможно выставить, например, переменную-флаг, на которую можно было бы ориентироваться.


Название: Re: QML - последовательность вызовов onAccepted(), onRejected(), onClose().
Отправлено: kambala от Сентябрь 30, 2022, 17:55
а зачем такое хитрое поведение? обычно отмена идентична закрытию окна. может проще сделать 3 кнопки?

как вариант, можно установить значение флажка в каждом из обработчиков, а считать его в onDestroyed. или написать обертку, которая будет анализировать код возврата диалога.


Название: Re: QML - последовательность вызовов onAccepted(), onRejected(), onClose().
Отправлено: juvf от Октябрь 24, 2022, 08:01
Сделать  две кнопки [OK] и [Cancel] плюс  в уголку кнопка закрытия [X] кнопка [MyX].

диалогу обработчики:
Код:

onAccepted() { ... Действие 1 ... }
onRejected() { ... Действие 2 ... }
onMyX() { ... Действие 3 ... }

Т.е. образом в onClose() вообще ни нужно ни чего анализировать. Вызываете Действие 3, делаете нужный код и в конце вызываете onClose() принудительное закрытие окна. Так получиться?