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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QML - последовательность вызовов onAccepted(), onRejected(), onClose().  (Прочитано 2540 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Сентябрь 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(), то есть невозможно выставить, например, переменную-флаг, на которую можно было бы ориентироваться.
« Последнее редактирование: Сентябрь 30, 2022, 16:09 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Сентябрь 30, 2022, 17:55 »

а зачем такое хитрое поведение? обычно отмена идентична закрытию окна. может проще сделать 3 кнопки?

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

Изучением 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
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #2 : Октябрь 24, 2022, 08:01 »

Сделать  две кнопки [OK] и [Cancel] плюс  в уголку кнопка закрытия [X] кнопка [MyX].

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

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

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


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