在使用QCompleter选择自动完成文本后,如何清除文本框(QLineEdit(? - 没有什么对我有用。
下面是我的代码的一个更简单的示例:它是一个简单的"echo"控制台应用程序,它从QLineEdit(输入文本框(获取文本命令并将其写入QTextBrowser(输出文本框(。用户在输入文本框上按 Enter 后,应将该文本框中的文本添加到输出文本框中,并清除输入文本框(以便为下一个命令做好准备(。
当输入不在自动完成选项中的新文本时,一切正常:文本被添加到输出文本框并从输入文本框中清除。但是,当用户从自动完成选项(使用向下/向上箭头(中选择其中一个选项,然后按 Enter 时,文本将添加到输出文本框中,但不会从输入文本框中删除...
这两种情况都会调用我的回调函数(触发器函数(,该函数应清除输入文本框,使用:
self.consoleCommandLineEdit.clear()
但是当 ENTER 选择自动完成文本时,输入文本框不会被清除...... 文本已正确添加到输出文本框中,因此正确调用了我的回调函数。 看起来完成器在我清除后正在填充我的文本框...... 如何禁用此行为并确保清除输入文本框?我可以删除它吗?
下面是整个示例。您可以通过键入"zzz"或任何其他不在自动完成列表中的文本并按 Enter 来尝试,然后尝试键入"a",然后用键盘向下转到"aaa1"(或自动完成选项上的任何其他文本(并按 ENTER。在这种情况下,您将看到输入文本框未清除。
import sys
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import (
QApplication,
QWidget,
QMainWindow,
QVBoxLayout,
QLineEdit,
QTextBrowser,
QCompleter,
)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("console")
self.setGeometry(10, 50, 500, 800)
# Create text box for input
self.consoleCommandLineEdit = QLineEdit()
self.consoleCommandLineEdit.setFixedHeight(25)
self.consoleCommandLineEdit.editingFinished.connect(self.gotConsoleCommand)
self.model = QStandardItemModel()
self.model.appendRow(QStandardItem('aaa1'))
self.model.appendRow(QStandardItem('aaa2'))
self.model.appendRow(QStandardItem('aaa3'))
completer = QCompleter(self.model, self)
self.consoleCommandLineEdit.setCompleter(completer)
# Create text box for output
self.consoleViewer = QTextBrowser(lineWrapMode=QTextBrowser.NoWrap)
widget = QWidget()
self.setCentralWidget(widget)
vlay = QVBoxLayout(widget)
vlay.addWidget(self.consoleCommandLineEdit)
vlay.addWidget(self.consoleViewer)
def gotConsoleCommand(self):
cmd = self.consoleCommandLineEdit.text()
self.consoleCommandLineEdit.clear()
self.consoleViewer.append(cmd) # add cmd to output box
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())
问题是QCompleter的任务是完成QLineEdit的文本,这就是它正在做的事情,我详细解释了正在发生的事情: 用户选择QCompleter的弹出选项之一,然后按回车键, 这会导致弹出窗口关闭,但也会将回车键的事件发送到 QLineEdit,从而导致发出编辑完成信号, 您的代码会删除文本,但随后 QCompleter 会添加所选文本。
解决方案是,添加该文本后,您必须使用 QTimer 和激活的 QCompleter 信号进行清理:
# ...
completer = QCompleter(self.model, self)
completer.activated.connect(self.onActivated)
# ...
def onActivated(self):
QTimer.singleShot(0, self.consoleCommandLineEdit.clear)