我正在尝试使用 QLineEdit 的 QCompleter 类在键入时提供自动完成建议,并在用户输入新文本后更新建议。但是,当我尝试使用以完成者列表中已经存在的内容开头的文本来更新完成者时,它只会使整个应用程序崩溃,没有可见的异常!甚至 try-except 也没有捕捉到这个错误,我无法理解我做错了什么......
下面是我的代码的一个更简单的示例:它是一个简单的“回显”控制台应用程序,它从 QLineEdit(输入文本框)获取命令并将其写入 QTextBrowser(输出文本框)。当输入全新的“命令”(文本)时,它工作正常,并被添加到完成者中,所以下次我可以看到它。但是,如果新文本的开头与完成列表中的其他词相似,则选择它会使整个 GUI 应用程序崩溃,没有可见的异常,即使我在调试模式下运行也不...
请看下面我的例子,并尝试在上面的文本框选项写:a,aa,aaa(开始类似于完成词:aaa1)
我究竟做错了什么??
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QVBoxLayout, QLineEdit, QTextBrowser, QCompleter
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setWindowTitle('console')
self.setGeometry(10, 50, 500, 800)
# Create text box for input
self.consoleCommandLineEdit = QLineEdit(self)
self.consoleCommandLineEdit.setFixedHeight(25)
self.consoleCommandLineEdit.editingFinished.connect(self.gotConsoleCommand)
self.completerCommands = ['aaa1','aaa2','aaa3'] # initial completer list
completer = QCompleter(self.completerCommands)
self.consoleCommandLineEdit.setCompleter(completer)
# Create text box for output
self.consoleViewer = QTextBrowser(self)
self.consoleViewer.setLineWrapMode(QTextBrowser.NoWrap)
widget = QWidget(self)
self.setCentralWidget(widget)
self.vlay = QVBoxLayout(widget)
self.vlay.addWidget(self.consoleCommandLineEdit)
self.vlay.addWidget(self.consoleViewer)
def gotConsoleCommand(self):
cmd = self.consoleCommandLineEdit.text()
self.consoleCommandLineEdit.setText('')
self.sendCommandToConsole(cmd)
def sendCommandToConsole(self,cmd):
self.consoleViewer.append(cmd) # add cmd to output box
if cmd not in self.completerCommands: # if the command is new, add it to the completer
self.completerCommands.append(cmd) # 1. add the new text to the list we have
completer = QCompleter(self.completerCommands) # 2. create a new completer object
self.consoleCommandLineEdit.setCompleter(completer) # 3. set the new completer as the LineEdit completer
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())