Как установить пост-конструкцию модели QCompleter - PullRequest
0 голосов
/ 29 сентября 2018

Я только начал с PyQt5 и у меня есть небольшой файл:

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setMinimumWidth(350)

        layout = QGridLayout()
        self.setLayout(layout)

        self.completer = QCompleter()
        self.completer.setCaseSensitivity(Qt.CaseInsensitive)
        self.completer.setCompletionMode(QCompleter.PopupCompletion)
        self.completer.setMaxVisibleItems(10)

        self.lineedit = QLineEdit()
        self.lineedit.setCompleter(self.completer)
        self.lineedit.setFixedHeight(30)
        self.lineedit.setFixedWidth(300)
        #self.lineedit.returnPressed.connect(self.show_selected)
        self.lineedit.textChanged.connect(self.text_changed)

        layout.addWidget(self.lineedit,0,0)

    def text_changed(self):
        #the function get_request returns a list of names taken from 
        #a database e.g ['matthew','mark','morris','mickey']
        vals = self.get_request(self.lineedit.text())
        self.completer.setModel(vals)

app = QApplication(sys.argv)

screen = Window()

sys.exit(app.exec_())

, и моя проблема заключается в этой ошибке:

TypeError: setModel(self, QAbstractItemModel): argument 1 has unexpected type 'list'

каждый раз, когда я запускаю приведенный выше код. Так что мой вопросэто: именно то, что я делаю не так здесь, я только начал с pyqt5 здесь и как моя первая программа, я сразу получаю эту ошибку. В качестве примечания, когда я использую фиксированный список и помещаю его в конструктор QCompleter программыработает, однако это не вариант, так как мне нужно, чтобы результаты менялись, когда пользователь набирает

1 Ответ

0 голосов
/ 29 сентября 2018

Вам необходимо обновить QStringListModel с помощью setStringList ()

import sys
from PyQt5.QtWidgets import QApplication, QLineEdit, QWidget, QGridLayout, QCompleter
from PyQt5.QtCore import Qt

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setMinimumWidth(350)

        layout = QGridLayout()
        self.setLayout(layout)

        self.completer = QCompleter([])  # Initialze with a list...to establish QStringListModel
        self.completer.setCaseSensitivity(Qt.CaseInsensitive)
        self.completer.setCompletionMode(QCompleter.PopupCompletion)
        self.completer.setMaxVisibleItems(10)

        self.lineedit = QLineEdit()
        self.lineedit.setCompleter(self.completer)
        self.lineedit.setFixedHeight(30)
        self.lineedit.setFixedWidth(300)
        self.lineedit.textChanged.connect(self.text_changed)
        layout.addWidget(self.lineedit,0,0)

    def get_request(self, line_text):
        if not line_text:
            return []
        char = line_text[0]
        if char == 'a':
            return ['aaa', 'abba', 'abby']
        if char == 'm':
            return ['matthew','mark','morris','mickey']
        return ['foo', 'bar', 'baz']

    def text_changed(self):
        #the function get_request returns a list of names taken from
        #a database e.g ['matthew','mark','morris','mickey']
        vals = self.get_request(self.lineedit.text())

        model = self.completer.model()
        model.setStringList(vals)  # Updated the QStringListModel string list

app = QApplication(sys.argv)

screen = Window()
screen.show()

sys.exit(app.exec_())
...