2016-05-13 21 views
0

In meiner App habe ich eine QListView mit einem QStandardItemModel. Ich brauche die Elemente, um einige Benutzerdaten zu speichern, was OK ist, indem QStandardItem erweitert und meine eigenen Daten hinzugefügt werden. Aber ich möchte auch, dass Elemente in der Liste durch Ziehen neu angeordnet werden können und hier beginnt das Problem. Es scheint, dass QT das Objekt beim Ablegen klont, den Test und die Farbe kopiert, aber nichts über meine Benutzerdaten weiß. Ich habe versucht, es in clone() zu lösen, aber es wird nur mit dem Item-Prototyp aufgerufen (was ein leeres Item ist). Ich habe auch versucht, die setData() - Funktion zu überschreiben und die Rolle UserRole für meine Benutzerdaten zu verwenden, die aber beim Ziehen nicht kopiert wird.QStandardItem mit Benutzerdaten

Hat jemand ein Arbeitsbeispiel von etwas Ähnlichem?

Antwort

0

ich endlich einige Zeit an diesem Projekt arbeiten musste wieder und die Lösung gefunden. Ich hatte SetData überschrieben, um sicherzustellen, dass der Text und ein Regex-Muster aktualisiert wurden, wenn die Benutzerdaten festgelegt wurden, nur dass beim Drag & Drop-Verschieben das Element geklont wurde, ohne diese Funktion für meine Daten aufzurufen. Ich denke, die Implementierung kopiert nur die Mitglieder direkt. Also war meine Lösung, zu hören, um Ereignisse auf der Liste zu verschieben und dann alles, was für den neuen Gegenstand benötigt wird, zu aktualisieren.

0

Sie müssen die Unterklasse QStandardItem und überschreiben Sie die clone Methode. Sie sollten auch den Artikel Prototyp für das

class MyItem(QStandardItem): 

    def clone(self): 
     obj = super(MyItem, self).clone() 
     ... # copy user data as well 
     return obj 

model.setItemPrototype(MyItem()) 

Modell gesetzt Aber ich würde erwarten, dass die QStandardItem Benutzerdaten bereits kopieren. Wie stellen Sie Benutzerdaten ein? Im Allgemeinen sieht es aus wie diese

class MyItem(QStandardItem): 
    MyDataRole = Qt.UserRole + 1 
    MyOtherRole = Qt.UserRole + 2 

item.setData('a value', MyItem.MyDataRole)