Название: QML - последовательность вызовов onAccepted(), onRejected(), onClose(). Отправлено: xintrea от Сентябрь 30, 2022, 15:58 Сделал окошечко на базе Dialog, сделал две кнопки [OK] и [Cancel] плюс в уголку кнопка закрытия [X].
[OK] - вызывает accept() [Cancel] - вызывает reject() [X] - вызывает close() И, естественно, прописал диалогу обработчики: Код: onAccepted() { ... Действие 1 ... } Проблема в том, что если нажать 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] плюс в уголку
диалогу обработчики: Код: onAccepted() { ... Действие 1 ... } onRejected() { ... Действие 2 ... } onMyX() { ... Действие 3 ... } Т.е. образом в onClose() вообще ни нужно ни чего анализировать. Вызываете Действие 3, делаете нужный код и в конце вызываете |