QComboBox mit Autovervollständigung funktioniert in PyQt4, aber nicht in PySide
Ich habe ein Kombinationsfeld mit einem benutzerdefinierten Vervollständiger, das in PyQt4 einwandfrei funktioniert hat, in PySide jedoch nicht funktioniert.
Ich habe überprüft, dass der neue Vervollständiger den eingebauten Vervollständiger der QComboBox ersetzt, da keine Inline-Vervollständigung mehr erfolgt. Bei der Ausführung mit PySide wird jedoch keine gefilterte Liste von Optionen angezeigt.
Ich habe auch versucht sicherzustellen, dass der gesamte Text vollständig iststr
oder alleunicode
um Unterschiede zwischen der PyQt-API 1 mit QStrings und PySides Verwendung von Python-Unicode-Typen zu vermeiden. Das Ändern der Texttypen hat weder Auswirkungen auf PyQt noch auf das Verhalten von PySide (PyQt funktioniert weiterhin, PySide funktioniert nicht).
Hier ist mein Code:
from PySide import QtCore
from PySide import QtGui
#from PyQt4 import QtCore
#from PyQt4 import QtGui
class AdvComboBox(QtGui.QComboBox):
def __init__(self, parent=None):
super(AdvComboBox, self).__init__(parent)
self.setFocusPolicy(QtCore.Qt.StrongFocus)
self.setEditable(True)
# add a filter model to filter matching items
self.pFilterModel = QtGui.QSortFilterProxyModel(self)
self.pFilterModel.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
self.pFilterModel.setSourceModel(self.model())
# add a completer, which uses the filter model
self.completer = QtGui.QCompleter(self.pFilterModel, self)
# always show all (filtered) completions
self.completer.setCompletionMode(QtGui.QCompleter.UnfilteredPopupCompletion)
self.setCompleter(self.completer)
# connect signals
def filter(text):
print "Edited: ", text, "type: ", type(text)
self.pFilterModel.setFilterFixedString(str(text))
self.lineEdit().textEdited[unicode].connect(filter)
self.completer.activated.connect(self.on_completer_activated)
# on selection of an item from the completer, select the corresponding item from combobox
def on_completer_activated(self, text):
print "activated"
if text:
print "text: ", text
index = self.findText(str(text))
print "index: ", index
self.setCurrentIndex(index)
# on model change, update the models of the filter and completer as well
def setModel(self, model):
super(AdvComboBox, self).setModel(model)
self.pFilterModel.setSourceModel(model)
self.completer.setModel(self.pFilterModel)
# on model column change, update the model column of the filter and completer as well
def setModelColumn(self, column):
self.completer.setCompletionColumn(column)
self.pFilterModel.setFilterKeyColumn(column)
super(AdvComboBox, self).setModelColumn(column)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
combo = AdvComboBox()
names = ['bob', 'fred', 'bobby', 'frederick', 'charles', 'charlie', 'rob']
# fill the standard model of the combobox
combo.addItems(names)
combo.setModelColumn(0)
combo.resize(300, 40)
combo.show()
sys.exit(app.exec_())