Problem mit QtfindItem in Schleife

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Marc_Schumann
User
Beiträge: 3
Registriert: Mittwoch 16. März 2016, 14:13

Hallo, bin neu im Forum, daher erstmal Gruß an Alle!.

Bei einem Problem mit der findItem Funktion komme ich nicht weiter. Zumindest sehe ich nicht mein Problem ( Knoten im Kopf ?)

Ziel ist es ein Treeviewmodel abzufragen um gefundene Items dann zu markieren. Prinzipiell läuft das Problemlos.
Nur wenn ich den Code innerhalb der Kommentarzeilen ausführe, findet die Funktion nur den ersten Treffer.
Der nichtkommentierte Teil macht prinzipiell dasselbe, nur dass er wie gewünscht auch alle Treffer findet.
die Print(Material) Funktion liefert auch korrekt das entsprechende Suchkriterium, nur findItem ... findet nur beim erstmaligen Aufruf Treffer.

Code: Alles auswählen

def __Vorauswahl():
            ''' ---------------- Das hier findet nur beim ersten Lauf der for Schleife alle Treffer  :
            if len(ini['MaterialVorauswahl']) > 1 :
                Materialvorauswahl = ini['MaterialVorauswahl'].split(",") # geliefert wird ein String mit Komma getrennten Wörtern
                
            else :
                Materialvorauswahl = ini['MaterialVorauswahl']
                
            for Material in Materialvorauswahl:
            print(Material)  # Kontrolle zeigt dass Material richtig gewechselt wird in der for Schleife
                
                for item in self.model5.findItems(Material,  Qt.MatchContains ):     # hier wird das Material NICHT richtig eingesetzt
                    if item.isCheckable():
                        item.setCheckState(QtCore.Qt.Checked)
                    print ( item.data(QtCore.Qt.DisplayRole), "Materialvorauswahlarray : ", Materialvorauswahl)
           
            '' ------------------ Das hier macht doch prinzipiell nichts anderes, aber es findet alle Treffer :
            if "Platten" in ini['MaterialVorauswahl']:
                for item in self.model5.findItems("Platten",  Qt.MatchContains ):
                    if item.isCheckable():
                        item.setCheckState(QtCore.Qt.Checked)
            if "Kanten" in ini['MaterialVorauswahl']:
                for item in self.model5.findItems("Kanten",  Qt.MatchContains ):
                    if item.isCheckable():
                        item.setCheckState(QtCore.Qt.Checked)   
            if "Belag" in ini['MaterialVorauswahl']:
                for item in self.model5.findItems("Belag",  Qt.MatchContains ):
                    if item.isCheckable():
                        item.setCheckState(QtCore.Qt.Checked)
            if "Oberfläche" in ini['MaterialVorauswahl']:
                for item in self.model5.findItems("Oberfläche",  Qt.MatchContains ):
                    if item.isCheckable():
                        item.setCheckState(QtCore.Qt.Checked)
            if "Massiv" in ini['MaterialVorauswahl']:
                for item in self.model5.findItems("Massiv",  Qt.MatchContains ):
                    if item.isCheckable():
                        item.setCheckState(QtCore.Qt.Checked)

Bisher habe ich kein Problem in meiner Logik erkannt... Bitte um Erleuchtung. Danke schonmal im voraus
BlackJack

Wie sieht denn ``ini['MaterialVorauswahl']`` aus? Kann es sein das die Begriffe nicht nur durch Kommas getrennt sind, sondern das da auch Leerzeichen bei sind?
Marc_Schumann
User
Beiträge: 3
Registriert: Mittwoch 16. März 2016, 14:13

ini['MaterialVorauswahl'] wird via configparser aus MaterialVorauswahl = Kanten, Platten ausgelesen. Leerzeichen sind im String enthalten.

Hatte aber auch schon mit :
for Material in Materialvorauswahl:
Material.replace(" " , "" )

keinen Erfolg. das Verhalten ist dasselbe... Abgesehen davon sollte das bei Qt.MatchContains kein Problem sein, da z.B. das "Plattenitem" auch Plattenmaterial heißt, aber mit dem Suchwort Platten gefunden wird. Allerdings habe ich gerade festgestellt, das Material.replace(" " , "" ) scheinbar nicht das führrende Leerzeichen entfernt hat... Muss ich nochmal nachsehen ob das innerhalb der Schleife vielleicht ein prinzipielles Problem ist. Hatte ich noch nicht...
BlackJack

@Marc_Schumann: Doch natürlich ist das Leerzeichen ein Problem. Das wäre kein Problem wenn es in dem Wert im Model vorkommt, wenn es dort aber *nicht* vorkommt, aber im Suchbegriff, dann ist der Suchbegriff *mit Leerzeichen* nicht in dem Wert vorhanden und damit wird das auch nicht gefunden:

Code: Alles auswählen

In [1]: 'Platten' in 'Plattenmaterial'
Out[1]: True

In [2]: 'Platten ' in 'Plattenmaterial'
Out[2]: False
Das `replace()` liefert Dir wie alle Methoden die eine Zeichenkette ”verändern”, eine neue veränderte Zeichenkette, denn Zeichenketten sind unveränderbar. Du musst also den Rückgabewert verwenden und nicht die unveränderte Zeichenkette.
Marc_Schumann
User
Beiträge: 3
Registriert: Mittwoch 16. März 2016, 14:13

Korrekt! Eigentlich ist es ja logisch aber manchmal sieht man die einfachsten Sachen erst wenn man mit der Nase draufgestoßen wird.

Danke!
Antworten