【问题标题】:QLineEdit: show new text before processing textEdited signalQLineEdit:在处理 textEdited 信号之前显示新文本
【发布时间】:2016-10-17 15:37:01
【问题描述】:

我有一个 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() 的调用(在处理第一个键时)会处理第二个键,因此我的插槽不会处理第二个键。有意义吗?

【问题讨论】:

    标签: pyqt5 qlineedit


    【解决方案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 信号并调用与其连接的插槽。

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

    【讨论】:

    • 谢谢!是的,这将解决 QLineEdit 刷新问题,因为在 Timer 启动后,GUI 会取回控件并更新 QLineEdit 中显示的文本。
    • 无论如何,我想我现在有一个更复杂的问题......如果 filterList 过程需要很长时间(比如从互联网下载元素的长列表),所有输入都由用户将被阻止,直到过滤完成......我不知道我是否可以不时将控制权交还给 GUI 进程,或者我需要使用线程。我有点迷茫了,我会提出一个新问题。
    • @Pablovx。是的,您需要为此提出一个新问题。 PS:如果你觉得它有用,请接受这个答案(即点击勾号)。
    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多