为 QLineEdit 控件增加历史记录功能
普通的 QLineEdit 控件只能实现简单的文本输入功能。但是,有时候我们想让它像百度一样,提供历史记录功能。
找了半天,没有找到合适的控件。唯一相近的是QComboBox,但是它只能使用已经确定的列表,不能增加新的项。
使用两个控件组合,也可以实现该功能。但这就有点笨了。在网上搜了搜,发现一个比较好的思路。那就是使用 QLineEdit 作为父类,编写一个新的控件。在QLineEdit 的基础上,增加历史记录的功能。
完整代码如下:
from PyQt5 import QtCore, QtGui, QtWidgets # QLineEdit添加历史记录功能,按下回车添加至历史中。 class LineEditWithHistory(QtWidgets.QLineEdit): def __init__(self, parent ,inputList=[]): super(LineEditWithHistory, self).__init__(parent) #用于存放历史记录的List self.inputList = [] f = open("pathList.txt","r") for a in f: a = a.replace("\n","") self.inputList.append(a) #replace(" ").replace("\n") f.close() #LineEdit设置QCompleter,用于显示历史记录 self.completer = QtWidgets.QCompleter(self) self.listModel = QtCore.QStringListModel(self.inputList, self) self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.completer.setModel(self.listModel) self.completer.activated.connect(self.Slot_completer_activated) self.setCompleter(self.completer) #输入完成按下回车后去重添加到历史记录中 self.returnPressed.connect(self.Slot_editingFinished) def Slot_editingFinished(self): content = self.text() if content != "": if content not in self.inputList: self.inputList.append(content) f = open("pathList.txt","a") f.writelines(self.inputList) f.close() self.listModel.setStringList(self.inputList) self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion) #按下回车后恢复显示模式 def Slot_completer_activated(self,text): self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion) def event(self, event): #按下Tab键时弹出所有记录 if event.type() == QtCore.QEvent.KeyPress and event.key() == QtCore.Qt.Key_Tab: # 设置不过滤显示 self.completer.setCompletionMode(QtWidgets.QCompleter.UnfilteredPopupCompletion) self.completer.complete() self.completer.popup().show() return True return super().event(event) def mousePressEvent(self, event): # 重载一下鼠标点击事件 # 单击文本编辑框,弹出历史记录。 if event.buttons () == QtCore.Qt.LeftButton: # 设置不过滤显示 self.completer.setCompletionMode(QtWidgets.QCompleter.UnfilteredPopupCompletion) self.completer.complete() self.completer.popup().show()
该代码参考了,如下文章:《》
部分细节做了调整,增加了鼠标点击弹出历史记录的功能。
通过这个新控件的编写,加深了对PyQt 5 控件、消息机制和 Python 类实现的理解。