Qt QCompleter несколько совпадений - PullRequest
       14

Qt QCompleter несколько совпадений

5 голосов
/ 23 сентября 2010

Я пытаюсь сделать так, чтобы QCompleter соответствовал нескольким эквивалентным опциям, которые разделяются запятыми.Казалось бы, это не простой способ сделать это, но одна строка ссылки QCompleter привлекла мое внимание, описывая функцию QCompleter :: splitPath: «При использовании с моделями списка первый элемент в возвращенном списке используется для сопоставления».Можно ли это использовать так, как мне нужно - разбить входную строку и вернуть ее, чтобы незавершенный последний элемент был первым в списке?Мне не удалось заставить это работать, но я могу делать что-то не так.

Ответы [ 3 ]

5 голосов
/ 04 апреля 2011

Вот еще один способ сделать это, который, я думаю, больше соответствует первоначальному вопросу. Нет необходимости в сложной модели данных, вместо этого используется простая модель 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_())
1 голос
/ 23 сентября 2010

Исходя из того, что я понимаю из вашего вопроса и документа, вы можете отделить введенную пользователем строку запятыми и выполнить полную проверку в вашей модели для завершения.

НО, после каждой запятой указательвашей модели (представьте, что это двумерный массив строк) будет увеличен.

Например, если у вас есть следующий ввод:

ABCD, EFGH, IJ

и вы хотите, чтобы завершитель завершил IJ KL , вам потребуется модель, ширина которой не менее 3-х индексов, поскольку первый текст (ABCD) будет дополнен строками в первомстолбец, EFGH будет дополнен вторым столбцом вашей модели и т. д.

Итак, я не знаю, можно ли его использовать в вашем приложении.

Удачи.

0 голосов
/ 28 октября 2015

Универсальный многоцелевой код, который поддерживает все разделители в элементе 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]
...