QLineEdit: показывать новый текст перед обработкой текстового отредактированного сигнала

#pyqt5 #qlineedit

#pyqt5 #qlineправить #qlineedit

Вопрос:

У меня есть QLineEdit и слот, который обрабатывает текстовый отредактированный сигнал.

Я не хочу проверять текст, просто используйте его для фильтрации списка имен (другого виджета) с теми, которые соответствуют тексту в QLineEdit.

Я обнаружил, что текст, отображаемый в QLineEdit, обновляется только после обработки сигнала, и возникает вопрос: могу ли я сначала отобразить новый текст в QLineEdit, а затем обработать сигнал?

Теперь у меня есть:

 1. let's say user presses 'A' key in the QLineEdit
2. textEdited signal is emitted (but QLineEdit is not visually updated yet)
3. signal is processed in my slot (filtering a QListWidget)
4. QLineEdit is updated, showing the effect of pressing the key 'A' 
  

Если шаг 3 занимает много времени, слишком большая задержка между нажатием клавиши и отображением в QLineEdit, поэтому я хочу:

 1. let's say user presses 'A' key in the QLineEdit
2. textEdited signal is emitted (but QLineEdit is not updated yet)
3. signal is processed in my slot (filtering a QListWidget)
   i) update the QLineEdit object to reflect the pressed key 'A'
   ii) filter the QListWidget
  

Как я могу это сделать? Мне нужно что-то вроде метода QLineEdit.refresh()? Как я уже сказал, мне не нужно проверять текст, я просто хочу использовать его для фильтрации содержимого QListWidget, поэтому я хочу, чтобы все, что редактирует пользователь, отображалось как можно быстрее.

РЕДАКТИРОВАТЬ: я нашел это приложение QCoreApplication.processEvents() выполняет эту работу, но это влияет на процесс передачи сигнала, и некоторые нажатые клавиши не запускают сигнал, хотя я не понимаю почему. Кажется, что если пользователь, скажем, редактирует QLineEdit, нажимая две клавиши «слишком быстро», тогда вызов processEvents() в моем слоте (при обработке первого ключа) обрабатывает второй ключ, поэтому второй ключ не обрабатывается моим слотом. Есть ли в этом смысл?

Ответ №1:

Используйте таймер с одним выстрелом:

 self.timer = QtCore.QTimer()
self.timer.setSingleShot(True)
self.timer.setInterval(300)
self.timer.timeout.connect(self.filterList)
self.edit.textChanged.connect(lambda: self.timer.start())
  

Это приведет к повторному запуску таймера до тех пор, пока не наступит пауза, превышающая интервал таймера, после чего timeout сигнал будет отправлен и будет вызван слот, подключенный к нему.

Возможно, вам потребуется настроить интервал в соответствии со скоростью набора текста.

Комментарии:

1. Спасибо! Да, это решит проблему обновления QLineEdit, поскольку после запуска таймера графический интерфейс возвращает управление и обновляет текст, отображаемый в QLineEdit.

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

3. @Pablovx. Да, для этого вам нужно будет начать новый вопрос. PS: пожалуйста, примите этот ответ, если он показался вам полезным (т.Е. Нажмите галочку).