QCompleter Benutzerdefinierte Regeln Abschluss
Ich bin mit Qt4.6 und ich habe eine QComboBox mit einem QCompleter.
Die übliche Funktionalität ist die Bereitstellung von Abschluss-Hinweise (diese werden in einem dropdown-eher als inline -, das ist mein Sprachgebrauch), basierend auf einem Präfix. Zum Beispiel, gegeben
chicken soup
chilli peppers
grilled chicken
Eingabe ch
würde passen chicken soup
und chilli peppers
aber nicht grilled chicken
.
Was ich will ist, um in der Lage zu geben ch
und übereinstimmung mit allen von Ihnen, oder genauer gesagt, chicken
and match chicken soup
und grilled chicken
.
Ich möchte auch in der Lage sein, um ein Schlagwort wie chs
zu chicken soup
zu produzieren, ein weiteres match, das nicht nur auf den text Inhalt. Ich kann mit dem Algorithmus aber,
Welche QCompleter Funktionen muss ich überschreiben?
Ich bin mir nicht wirklich sicher, wo ich suchen sollte...
InformationsquelleAutor jcuenod | 2011-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf @j3frea Vorschlag, hier ist ein funktionierendes Beispiel (mit
PySide
). Es scheint, dass das Modell eingestellt werden muss, jedes mal, wennsplitPath
genannt wird (Einstellung der proxy einmal insetModel
funktioniert nicht).Ich erweiterte Sie Ihre Lösung in eine separate Antwort, weil ich ein Fehler in der Lösung. Die combobox schlägt vor, die richtigen Elemente, während Sie Tippen. Aber sobald ich drücken Sie die Rücktaste, um korrigieren Sie die Zeichenfolge, ich bin auf der Suche für das Kombinationsfeld nicht schlagen irgendwelche Gegenstände mehr.
InformationsquelleAutor Bruno
Aufbauend auf die Antwort von @Bruno, ich bin mit dem standard -
QSortFilterProxyModel
FunktionsetFilterRegExp
zum ändern der such-string. Auf diese Weise kann keine sub-classing ist notwendig.Außerdem behebt es einen bug in @Bruno die Antwort, die die Vorschläge verschwinden für einige Gründe, einmal den input-string habe mit backspace korrigiert während der Eingabe.
Update:
Ich dachte, dass meine bisherige Lösung gearbeitet, bis die Zeichenfolge in das Kombinationsfeld abgestimmt keines der Elemente der Liste. Dann die
QFilterProxyModel
war leer und dieser wiederum zurückgesetzt dentext
von der combobox. Ich habe versucht zu finden eine elegante Lösung für dieses problem, aber ich lief in Probleme (referenzierende Objekt gelöscht Fehler) immer wenn ich versuchte, etwas zu ändern, aufself.filterProxyModel
. So, jetzt der hacken ist, um das Modell derself.filterProxyModel
jedes mal neu, wenn das Muster aktualisiert wird. Und immer dann, wenn das Muster passt nicht alles in das Modell nicht mehr, geben Sie es ein neues Modell, das nur enthält den aktuellen text (akapath
imsplitPath
). Dies kann zu Leistungsproblemen führen, wenn Sie den Umgang mit sehr großen Modelle, aber für mich ist der hack funktioniert ziemlich gut.Update 2:
Erkannte ich, dass dies noch nicht der perfekte Weg zu gehen, denn wenn eine neue Zeichenfolge bei der Eingabe in die combobox und der Benutzer die EINGABETASTE drückt, wird die combobox wird wieder gelöscht. Der einzige Weg, um eine neue Zeichenfolge zu wählen Sie es aus der drop-down-Menü nach der Eingabe.
Update 3:
Geben Sie nun so gut funktioniert. Ich arbeitete rund um das zurücksetzen der combobox text einfach durch, wobei es aus dem laden, wenn der Benutzer die EINGABETASTE drückt. Aber ich steckte es wieder in, so dass die Fertigstellung der Funktionalität an Ort und Stelle bleibt. Wenn der Benutzer entscheidet, um Sie dann weiter bearbeitet.
QtCore.Qt.Key_Return
statt.InformationsquelleAutor P.R.
Verwenden
filterMode : Qt::MatchFlags
Eigenschaft. Diese Eigenschaft besitzt, wie die Filterung durchgeführt wird. Wenn filterMode eingestellt istQt::MatchStartsWith
nur diejenigen Einträge, die mit den eingegebenen Zeichen angezeigt werden.Qt::MatchContains
zeigt die Einträge an, die dem eingegebenen Zeichen undQt::MatchEndsWith
diejenigen, die Ende mit den eingegebenen Zeichen. Derzeit nur diese drei Modi sind implementiert. Einstellung filterMode zu anderenQt::MatchFlag
wird die Ausgabe einer Warnung, und keine Aktion ausgeführt wird. Der Standard-Modus istQt::MatchStartsWith
.Diese Eigenschaft wurde in Qt 5.2.
Access-Funktionen:
In der aktuellen Umsetzung kann Man nicht, im weiteren durchaus möglich, schauen Sie auf der Qt::MatchFlags mögliche Werte. Auch Sie können pre-Sortieren Sie Ihre Modell gewünscht.
InformationsquelleAutor Aleksey Kontsevich
Dank Thorbjørn,
Ich hatte in der Tat das problem lösen, durch Erben von
QSortFilterProxyModel
.Den
filterAcceptsRow
Methode muss überschrieben werden und dann sind Sie einfach nur true oder false zurück, je nachdem, ob oder nicht Sie möchten, dass das Element angezeigt.Das problem mit dieser Lösung ist, dass es nur versteckt die Elemente in einer Liste und so können Sie nie neu anordnen Sie (das ist, was ich tun wollte, zu geben, bestimmte Gegenstände Vorrang).
[BEARBEITEN]
Ich dachte, ich würde werfen diese in die Lösung, da es [im Grunde] was ich am Ende tun (denn die oben genannte Lösung nicht ausreichend). Ich verwendet http://www.cppblog.com/biao/archive/2009/10/31/99873.html:
QSortFilterProxyModel
zumindest können Sie individuell festlegen, wie die Elemente gefiltert werden! Btw, bist du sicher, dass nach Ihrem Art-filter gefiltert wurde, die Ergebnisse, die QCompleter nicht noch auch wendet seinen eingebauten filtern?Lindeijer, um zu vermeiden, die
QCompleter
filter, ist es möglich, zu verwenden""
als Pfad und zeigen, was alles in der gefilterten Modell (ich habe gerade gebucht ein Beispiel). Vielleicht nicht die effizienteste, aber es scheint zu funktionieren.InformationsquelleAutor jcuenod
Leider, die Antwort ist derzeit, dass es nicht möglich ist. Zu tun, dass Sie brauchen, um doppelte viel von der Funktionalität von QCompleter in Ihrer eigenen Anwendung (Qt Creator macht das für seine Locator, siehe
src/plugins/locator/locatorwidget.cpp
für die Magie, wenn Sie interessiert sind).Mittlerweile konnte man abstimmen,QTBUG-7830, die über die es möglich machen eine Anpassung der Abschluss-Elemente aufeinander abgestimmt sind, wie Sie wollen. Aber nicht halten Sie Ihren Atem.
InformationsquelleAutor Thorbjørn Lindeijer
Können Sie rund um QTBUG-7830, wie oben erwähnt, durch die Bereitstellung von benutzerdefinierten Rolle und machen Abschluss auf der Rolle. In der handler, die Rolle, Sie können den trick tun zu lassen QCompleter, dass dieses Element da ist. Dies funktioniert, wenn Sie auch außer Kraft setzen, filterAcceptsRow in Ihrem SortFilterProxy Modell.
InformationsquelleAutor psp