автозаполнение Python GUI по значению ключа - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь создать графический интерфейс автозаполнения в python, чтобы при вводе имени я видел возможные фамилии.Например, допустим, у меня есть этот словарь: {"George": ["Washington", "Bush"]}.Когда я начинаю печатать «G», я хочу, чтобы он показывал «Вашингтон» и «Буш».Когда выбран «Вашингтон», я хочу показать «Вашингтон».Я новичок в GUI и думаю, что в PyQt есть пример автозаполнения, но слова не в парах ключ-значение, а в списке слов.https://wiki.python.org/moin/PyQt/Adding%20auto-completion%20to%20a%20QLineEdit

Есть ли способ отредактировать код в ссылке, чтобы я мог включить эту функцию?Спасибо!

1 Ответ

0 голосов
/ 03 марта 2019

Необходимо переопределить метод pathFromIndex, чтобы при выделении некоторого текста соответствующая опция записывалась в QLineEdit, а для изменения того, что отображается во всплывающем окне, должен использоваться делегат.

from PyQt5 import QtCore, QtGui, QtWidgets

def create_model(d):
    model = QtGui.QStandardItemModel()
    for key, value in d.items():
        for val in value:
            it = QtGui.QStandardItem(key)
            it.setData(val, QtCore.Qt.UserRole)
            model.appendRow(it)
    return model

class StyledItemDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(StyledItemDelegate, self).initStyleOption(option, index)
        option.text = index.data(QtCore.Qt.UserRole)

class Completer(QtWidgets.QCompleter):
    def __init__(self, parent=None):
        super(Completer, self).__init__(parent)
        QtCore.QTimer.singleShot(0, self.change_delegate)

    @QtCore.pyqtSlot()
    def change_delegate(self):
        delegate = StyledItemDelegate(self)
        self.popup().setItemDelegate(delegate)

    def pathFromIndex(self, index):
        return index.data(QtCore.Qt.UserRole)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    d = {
        "George": ["Washington", "Bush"],
        "Languages": ["Python", "C++"]
    }
    model = create_model(d)
    w = QtWidgets.QLineEdit()
    completer = Completer(w)
    completer.setModel(model)
    w.setCompleter(completer)
    w.show()
    sys.exit(app.exec_())
...