我试图使用QLineEdit的QCompleter类在键入时提供自动完成建议,并在用户输入新文本后更新建议。但是,当我尝试用以已经在完成列表中的内容开头的文本更新完成器时,它只是使整个应用程序崩溃,没有可见的异常!即使尝试,除了没有抓住这个错误,我不明白我做错了什么
下面是我的代码的一个简单示例:它是一个简单的“echo”控制台应用程序,从QLineEdit(输入文本框)获取命令并将其写入QTextBrowser(输出文本框)。当输入全新的“命令”(文本)时,它工作正常,并被添加到完成符中,所以下次我可以看到它。但是,如果新文本开始时与completer列表中的其他单词类似,则选择它会使整个GUI应用程序崩溃,并且不会出现异常,即使在调试模式下运行时也是如此
请参阅下面的示例,并尝试在上面的文本框中编写选项,如:a、aa、aaa(其开头类似于completer ready word: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_())
我还没有找到问题的原因,但这是一个比每次需要添加新文本时创建一个新的QCompleter更好的解决方案。在这种情况下,最好使用模型来存储作为QCompleter信息基础的文本
也许有一点可以帮助我们理解这个问题,那就是如果您向QCompleter添加一个父项,那么问题就不会发生:
但我强调:最好的解决方案是使用模型
相关问题 更多 >
编程相关推荐