Я могу сказать вам, что, во-первых, очень сложно попытаться обернуть QCompleter вокруг новой функциональности. Вы должны быть в состоянии удовлетворить весь интерфейс QCompleter и соединить его с этим реальным кодом.
Вы должны вручную обновить набор QStringListModel в QCompleter и обеспечить реализацию получения текущего завершения и общего количества завершений для данного префикса поиска.
Вот рабочий пример, совместимый с режимом PopupCompletion:
import re
class ReadlineCompleter(QtGui.QCompleter):
def __init__(self, completeFn, *args, **kwargs):
super(ReadlineCompleter, self).__init__(*args, **kwargs)
self._completer = completeFn
self.setModel(QtGui.QStringListModel())
self.update()
def setCompletionPrefix(self, val):
super(ReadlineCompleter, self).setCompletionPrefix(val)
self.update()
def currentCompletion(self):
state = self.currentRow()
return self._completionAt(state)
def completionCount(self):
state = 0
while True:
result = self._completionAt(state)
if not result:
break
state += 1
return state
def update(self):
matches = [self._completionAt(i) for i in xrange(self.completionCount())]
self.model().setStringList(matches)
def _completionAt(self, state):
text = str(self.completionPrefix())
# regex to split on any whitespace, or the char set +*/^()-
match = re.match(r'^(.*)([\s+*/^()-]+)(.*)$', text)
if match:
prefix, sep, text = match.groups()
result = self._completer(str(text), state)
if result and match:
result = sep.join([prefix, result])
return '' if result is None else result
Обратите внимание, что в методе _completionAt()
я добавил дополнительные функции, которые вы хотели, для обнаружения шаблона разделителя. Вы можете настроить это, очевидно. Но он отделит последнюю часть и будет использовать это значение для проверки завершения, а затем снова объединит результат с префиксом.
Использование
Важный. Вам нужно подключить сигнал textChanged
от QLineEdit к компоновщику, чтобы принудительно обновить. В противном случае никакая функциональность в компоновщике использоваться не будет.
line = QtGui.QLineEdit()
comp = ReadlineCompleter(completer)
comp.setCompletionMode(comp.PopupCompletion)
line.setCompleter(comp)
# important
line.textChanged.connect(comp.setCompletionPrefix)
Здесь есть примеры показывая, как другим людям приходилось заполнять функциональные возможности в пользовательском редактировании строки, где они полностью обходят стандартную сигнализацию средства завершения и запускают его сами. Вы можете видеть его немного усилий.
person
jdi
schedule
09.07.2012