為 QLineEdit 控制元件增加歷史記錄功能 QLineEdit 按鍵Tab鍵時 顯示歷史記錄
阿新 • • 發佈:2022-04-11
普通的 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 類實現的理解。