Qt QCompleter несколько совпадений
Я пытаюсь заставить QCompleter соответствовать нескольким эквивалентным опциям, которые разделяются запятыми. Казалось бы, это не простой способ сделать это, но одна строка ссылки QCompleter привлекла мое внимание, описывая функцию QCompleter::splitPath: "При использовании с моделями списков первый элемент в возвращенном списке используется для сопоставления". Можно ли это использовать так, как мне нужно - разбить входную строку и вернуть ее, чтобы незавершенный последний элемент был первым в списке? Мне не удалось заставить это работать, но я могу делать что-то не так.
3 ответа
Вот еще один способ сделать это, который, я думаю, больше соответствует первоначальному вопросу. Нет необходимости в сложной модели данных, вместо этого используется простая модель QStringListModel.
import sys
from PyQt4 import QtCore, QtGui
class test(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
model = QtGui.QStringListModel()
wordList = ['John Doe','Jane Doe','Albert Einstein', 'Alfred E Newman']
model.setStringList(wordList)
layout = QtGui.QVBoxLayout(self)
self.line = QtGui.QLineEdit(self)
layout.addWidget(self.line)
complete = CustomCompleter(self)
complete.setModel(model)
complete.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
complete.setCompletionMode(0)
complete.setWrapAround(False)
self.line.setCompleter(complete)
class CustomCompleter(QtGui.QCompleter):
def __init__(self, parent=None):
QtGui.QCompleter.__init__(self, parent)
def pathFromIndex(self, index):
path = QtGui.QCompleter.pathFromIndex(self, index)
lst = str(self.widget().text()).split(',')
if len(lst) > 1:
path = '%s, %s' % (','.join(lst[:-1]), path)
return path
def splitPath(self, path):
path = str(path.split(',')[-1]).lstrip(' ')
return [path]
#===============================================================================
# Unit Testing
#===============================================================================
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = test()
window.show()
sys.exit(app.exec_())
Исходя из того, что я понимаю из вашего вопроса и документа, вы можете отделить введенную пользователем строку запятыми и выполнить полную проверку в своей модели для завершения.
НО, после каждой запятой индекс вашей модели (представьте, что это двумерный массив строк) будет увеличиваться.
Например, если у вас есть следующий ввод:
ABCD, EFGH, IJ
и вы хотели бы, чтобы завершитель закончил IJ KL, у вас должна быть модель шириной не менее 3 индексов, потому что первый текст (ABCD) будет дополнен строками в первом столбце, EFGH будет дополнен второй столбец вашей модели и т. д.
Так что я не знаю, можно ли это использовать в вашем приложении.
Удачи.
Универсальный многоцелевой код, который поддерживает все разделители в члене DELIMITERS, можно найти в фрагменте кода ниже. Это кажется простым, но отладка была очень неприятной из-за очень плохой документации на стороне pyQt.
class CustomCompleter(QtGui.QCompleter):
DELIMITERS = r'[()\[\]*+-=/\\]'
def __init__(self, parent=None):
QtGui.QCompleter.__init__(self, parent)
def pathFromIndex(self, index):
path = QtGui.QCompleter.pathFromIndex(self, index)
string = self.widget().text()
split = re.split(self.DELIMITERS, string)[-1]
if len(split)==len(string):
string_without_split = ''
else:
if len(split)>0:
string_without_split = string[:-len(split)]
else:
string_without_split = string
return string_without_split+path
def splitPath(self, path):
split = re.split(self.DELIMITERS, path)[-1]
return [split]