普通的 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()
該代碼參考了,如下文章:《QLineEdit 按鍵Tab鍵時 顯示歷史記錄》
部分細節做了調整,增加了鼠標點擊彈出歷史記錄的功能。
通過這個新控件的編寫,加深了對PyQt 5 控件、消息機制和 Python 類實現的理解。
