LINUX.ORG.RU

QML - последовательность вызовов onAccepted(), onRejected(), onClose().

 , , , ,


0

2

Сделал окошечко на базе 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(), то есть невозможно выставить, например, переменную-флаг, на которую можно было бы ориентироваться.

★★★★★

Последнее исправление: Xintrea (всего исправлений: 2)

Ответ на: комментарий от ya-betmen

В onClose() у меня вызовы удаления данных, которые использовались для работы окна.

А в onAccepted() - вызовы обработки данных, естественно.

И получается, что вначале данные удаляются, а потом происходит их обработка.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

У тебя там не только qml?

По идее в идеальном мире в твоем инстансе окна должны быть нужные ему данные которые помрут при его закрытии и руками ничего чистить не нужно.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

У тебя там не только qml?

Да, у меня при нажатии OK вызывается функция C++, обрабатывающая крупный массив данных.

И в onRejected() и в onClose() тоже должна вызываться функция C++, в которой удаляется этот крупный массив данных.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Варианты:

Попробуй обработчик onActionChosen (та и вообще почитай в спеке диалога что он там умеет, повесить принтлайны на каждое действие не очень сложно)

Загружай данные в онАкцепт

Чисти старые данные перез загрузкой новых

Не чисти данные

ya-betmen ★★★★★
()