Я пытаюсь завершить заполнение строки при редактировании строки, когда в нее вводится некоторая строка типа «имя, фамилия», каждая из которых соответствует одному из двух столбцов модели таблицы (конечная цель состоит в том, чтобыбыть гибким, но на данный момент я просто хочу, чтобы это работало).В настоящее время я пытаюсь сделать следующее:
a) объединить результаты из двух столбцов в прокси и третий столбец, который просто имеет имя, фамилию как дискретную строку (что неудобно, еслипользователь вводит его как фамилию, имя. Текущая реализация не работает, потому что когда я пытаюсь сделать setCompletionColumn для столбца «поддельные», он не активирует мой метод переопределенных данных. columnCount включает в себя поддельный столбец, хотя)
б) иметь Completer, который не фильтрует, с прокси-моделью бэкэнда, фильтр acceptptsrow () которого фильтрует как первый, так и последний (не знаю, как сделать нефильтрующий завершитель - иначе он просто просматривает один столбец ивсплывающее окно в конце показывает группу имен без фамилий)
в) подделать модель дерева и сделать так, чтобы, когда я ставлю запятую, модель просматривает "ветку", состоящую из всехлюди, чьи имена ИЛИ (начинаются с?) - строка перед запятой.(Я просто не уверен, как начать с этого, он использует тот же тип acceptptsrow, что и b), но я не знаю, как делать это как отдельные ~ ветви ~)
это вызывает у меня головную боль, ини одна из этих реализаций не особенно приятна.Я делаю это слишком тяжело для себя и люблю использовать неправильный инструмент, или это просто то, к чему я должен пристегнуться?Я могу вставить некоторый код, но мне интересно, если то, что я делаю, имеет смысл.
обновление: фрагменты кода и пиксель
] 1
красный круг - это то, о чем я говорю с несколькими именами, они соответствуют различным записям в таблице, но завершитель ограничен одним столбцом.С точки зрения щелчка и получения имени пользователя, которое я понял, это в основном понятно, это просто формат и обработка запятых.
Вот часть моего полного класса:
class CustomQCompleter(QCompleter): #dropdown box of suggestions
def __init__(self, parent=None,*args):#parent=None):
self.columnind=0
super(CustomQCompleter, self).__init__(*args)
self.parent=parent
self.setCompletionColumn(self.columnind)
def pathFromIndex(self,index,role=QtCore.Qt.DisplayRole): #decides what gets put into selection box
#print(index)
model=self.source_model
return model.data(model.index(index.row(),self.columnind),role=QtCore.Qt.DisplayRole)
def splitPath(self, path):
self.local_completion_prefix = path #???
print(path)
sp=self.local_completion_prefix.split(',')
if len(sp)>1: #
print('path split')
return sp
return [path]
и вот акцепт на моей повторно реализованной прокси-модели:
def filterAcceptsRow(self, row_num, parent): #input matches if this returns true
self.filterString=self.parent().inp.text()
self.filterList=[i.strip() for i in self.filterString.split(',')]
l=len(self.filterList)
while l<2:#easiest way to get thru this atm, clean up later
self.filterList.append('')
l=len(self.filterList)
if self.baseModel is not None:
model=self.baseModel
else:
model = self.sourceModel() # the underlying model,
# implmented as a python array
row = [model.data(model.index(row_num,0)),model.data(model.index(row_num,1))] #gets the data for this row from sql model in list format
#(row[0] starts with fname and row[1] starts w lname) OR vice versa
tests=[row[0].startswith(self.filterList[i]) and row[1].startswith(self.filterList[1-i]) for i in [0,1]]
#tests = len(self.filterSet.intersection(set([row[col] for col in self.filterColumns])))==2
# print(tests)
return True in tests
и в идеале это будет выглядеть примерно так: