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

QLineEdit: show new text before processing textEdited signal

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

编辑:我发现 QCoreApplication.processEvents() 可以工作,但它会影响信号的处理,有些按键不会触发信号,虽然我不明白为什么.似乎如果用户说按两个键 "too fast" 编辑 QLineEdit,那么我的插槽中对 processEvents() 的调用(在处理第一个键时)会处理第二个键,因此我的插槽不会处理第二个键.有道理吗?

使用单次定时器:

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

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