如何设置一个QCompleter模型post构建
How to set a QCompleter model post construction
我刚开始使用 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'
每次我 运行 以上 code.So 我的问题是:我到底做错了什么,我刚开始使用 pyqt5 作为我的第一个程序,我立即得到这个 error.As 旁注,当我使用固定列表并将其放入 QCompleter
构造函数时,程序可以运行,但这不是一个选项,因为我需要结果随用户输入而改变
您需要通过 setStringList() 更新 QStringListModel
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_())
我刚开始使用 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'
每次我 运行 以上 code.So 我的问题是:我到底做错了什么,我刚开始使用 pyqt5 作为我的第一个程序,我立即得到这个 error.As 旁注,当我使用固定列表并将其放入 QCompleter
构造函数时,程序可以运行,但这不是一个选项,因为我需要结果随用户输入而改变
您需要通过 setStringList() 更新 QStringListModel
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_())