QLineEdit:在处理textEdited信号之前显示新文本

时间:2016-10-17 15:37:02

标签: pyqt5 qlineedit

我有一个QLineEdit和一个处理textEdited信号的插槽。

我不想验证文本,只是使用它来过滤与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()方法的东西?正如我所说,我不需要验证de text,我只是想用它来过滤QListWidget的内容,所以我希望尽可能快地显示用户编辑的所有内容。

编辑:我发现QCoreApplication.processEvents()可以正常工作,但它会影响信号的过程,有些按键不会触发信号,虽然我不知道明白为什么。似乎如果用户说编辑QLineEdit按两个键"太快"然后我的插槽中的processEvents()调用(处理第一个键时)处理第二个键,因此我的插槽不处理第二个键。它有意义吗?

1 个答案:

答案 0 :(得分:0)

使用单次计时器:

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信号,并且将调用连接到它的插槽。

您可能需要调整间隔以适应打字速度。