J
I don't know if I understood you correctly, but as an option, I'd like to try:import sys
from PyQt5.Qt import *
class Completer(QCompleter):
def init(self, *args, **kwargs):
super(Completer, self).init(*args, **kwargs)
self.setCompletionMode(QCompleter.PopupCompletion)
self._le = args[-1]
self._path = ''
self._path_2 = ''
self._all_path = ''
self.lbl = QLabel(self._le)
self.lbl.setStyleSheet("""
QLabel {
font-family:'Consolas';
color: #777;
font: 25px;
background-color: #2b2b2b;
}
""")
self.lbl.hide()
def pathFromIndex(self, index):
rect = QRect(
self._le.cursorRect().x(),
self._le.cursorRect().y(),
self._le.width(),
self._le.completer().widget().height()
)
self.lbl.move(self._le.cursorRect().x()+8, self._le.cursorRect().y())
self.lbl.setText(index.data()[len(self._path_2):])
self.lbl.adjustSize()
self.lbl.show()
self._all_path = index.data()
return self._path
def splitPath(self, path):
self._path = self._le.text()
self._path_2 = path
return [path]
class LineEdit(QLineEdit):
def init(self):
super().init()
self._all_text = ''
self.multipleCompleter = None
def keyPressEvent(self, event):
super().keyPressEvent(event)
if not self.multipleCompleter:
return
c = self.multipleCompleter
if self.text() == "":
return
c.setCompletionPrefix(self.cursorWord(self.text()))
if len(c.completionPrefix()) < 1:
c.popup().hide()
return
c.complete()
def cursorWord(self, sentence):
p = sentence.rfind(" ")
if p == -1:
return sentence
return sentence[p + 1:]
def insertCompletion(self, text):
p = self.text().rfind(" ")
text = self.multipleCompleter._all_path
if p == -1:
pass
else:
text = self.text()[:p+1] + self.multipleCompleter._all_path
self.multipleCompleter.lbl.hide()
QTimer.singleShot(10, lambda: self.allText(text))
def allText(self, text):
self.setText(text)
self._all_text = text
self.setFocus()
self.update()
def event(self, event):
if self.multipleCompleter:
if self.multipleCompleter.popup().currentIndex().row() == -1:
self.multipleCompleter.lbl.hide()
else:
if not self.multipleCompleter.popup().selectedIndexes():
# self.multipleCompleter.popup().hide()
self.multipleCompleter.lbl.hide()
QTimer.singleShot(10, lambda: self.allText(self.multipleCompleter._path))
return super().event(event)
def setMultipleCompleter(self, completer):
self.multipleCompleter = completer
self.multipleCompleter.setWidget(self)
completer.activated.connect(self.insertCompletion)
if name == 'main':
app = QApplication(sys.argv)
editor = LineEdit()
editor.setStyleSheet("""
LineEdit {
font-family:'Consolas';
color: #fff;
font: 25px;
background-color: #2b2b2b;
}
""")
strList = [
'def', 'Python', 'PyQt5', 'Qt', 'Django', 'QML',
'matthew','mark','morris','mickey',
'the', 'function', 'get_request', 'returns', 'list',
'of', 'names', 'taken', 'from', '112233',
'telegram', 'PyCharm', 'Yandex', 'Minecraft',
'telegram-2', 'PyQt6', 'Yandex-2', 'Minecraft-2',
]
completer = Completer(strList, editor)
editor.setCompleter(completer)
completer.setCaseSensitivity(Qt.CaseInsensitive) # без учета регистра
editor.setMultipleCompleter(completer)
editor.show()
editor.resize(670, 70)
sys.exit(app.exec_())