QML Button onClicked порядок выполнения функции - PullRequest
0 голосов
/ 31 октября 2018

У меня есть кнопка с функцией onClicked. Существует класс C ++ Middle с функцией search_connection, подключенной через qmlRegisterType.

Что я хочу сделать, это изменить текст searchButton, пока функция C ++ вычисляет возвращаемое значение, а также отключить кнопку для этого времени.

То, что происходит, - ничто. Кнопка активирована на все время с текстом «Поиск». Я полагаю, что на самом деле происходит то, что функция search_connection выполняется первой, а затем все остальное происходит так быстро, что я не могу заметить переход от «Поиск» к «Поиск ...» и обратно.

TextField {
   id: startStop
}

TextField {
   id: finishStop
}

Button {
   id: searchButton
   text: qsTr("Search")

   onClicked: {
      text = qsTr("Searching...")
      enabled = false;
      searchResult.text = middle.search_connection(startStop.text,finishStop.text)
      enabled = true;
      text = qsTr("Search")
   }
}

Кто-нибудь знает, как заставить Qt вызывать функцию после изменения текста на "Поиск ..."?

1 Ответ

0 голосов
/ 31 октября 2018

Ваш пользовательский интерфейс перекрасит определенные области при следующем вызове цикла обработки событий. В вашем случае этого не происходит, потому что слот (ваша функция) вызывается напрямую и блокирует приложение до его завершения. Есть несколько способов избежать этой блокировки:

  • Переместите вашу задачу в другой поток ( QThread ) и дождитесь окончания
  • Запустите задачу с помощью таймера ( QML-Timer ). Вы можете перерисовать кнопку перед запуском метода, но ваш графический интерфейс будет по-прежнему блокироваться, пока метод не завершится (изменение enabled будет бесполезным).
  • Вызовите processEvents () внутри вашего метода несколько раз ( не рекомендуется, может вызвать проблемы).

Если для метода требуется некоторое время, я бы использовал новый поток. Таким образом, ваш графический интерфейс не блокируется, а ваша кнопка все равно будет получать события (рисование, мышь, ...).

Редактировать 1:

Если ваш код C ++ прост и может быть переведен в код JavaScript, вы также можете использовать WorkerScript . Это QML-версия QThread . Но у этого есть некоторые ограничения. Вы можете использовать только JavaScript и не можете взаимодействовать с Worker во время работы.

Спасибо folibis за предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...