Frage

meine Frage bezieht sich auf Qt und seine QAbstractItemModel .

Ich habe eine Karte von Strings und im Doppel (std::map<stringclass, double>), die ich in einem Qt-Widget möchte. Während ich könnte verwenden QTableView für das, würde Ich mag die Tatsache ausnutzen, dass die Schlüssel der Karte sind der Form „abc.def.ghi“, wo es können mehrere Zeichenfolgen, die mit „abc.def“ beginnen und noch mehr, die mit „abc“.

starten

Also habe ich die Einrichtung einer Baumdatenmodell möchte die Elemente in einem QTreeView zu präsentieren wie

(-) abc
    |--(-)def      
          |--ghi    3.1415
          |--jkl    42.0815
    |--(+)pqr
    |--(+)xyz

Die Tasten meiner std::map sind die Blätter des Baumes, wo alle anderen Knoten würde temporäre und auxillary Konstrukte sein, um die Faltung für die Benutzerfreundlichkeit zu unterstützen.

Leider ist die Methoden rowCount, index, columnCount und data have const-Modifikatoren, so kann ich nicht einfach Setup eine auxillary Datenstruktur für die Kopfzeilen in meinem QAbstractItemModel derivate und Veränderung, die Datenstruktur in dort.

Was wäre die beste Praxis für das? Soll ich Setup eine andere Klasse Schicht zwischen meinem std::map und die QAbstractItemModel oder gibt es eine smarter Weg, um dies?

zu tun

Bearbeiten 1: Der std::map kann, während ändert der QTreeView gezeigt und verwendet, so könnten die auxillary Knoten weggeworfen und rekonstruiert. Meine Vermutung ist, dass der beste Weg, dies zu handhaben zur Umstrukturierung ist die QAbstractItemModel - oder sollte ich werfen einfach das Modell entfernt und weisen eine neu constructred man die QTreeView ? In diesem Fall konnte ich alle Knoten innerhalb des Konstruktors Set-up, ohne durch die const-ness der Methoden gestört zu werden, denke ich.

War es hilfreich?

Lösung

würde ich die Karte analysieren und eine Baumdatenstruktur eines darauf basierenden erstellen. Stellen Sie sicher, dass Sie das Modell synchronisieren, wenn Sie die Karte ändern. Wenn dieser sync Schritt zu kompliziert wird Sie Ihre Daten in einer Baumstruktur von Anfang an und convert auf eine Karte halten möchte, wenn notwendig.

on the fly die Karte Parsing-Funktionen im Modell scheint wie eine schlechte Idee zu mir, Sie würden diese Funktionen wollen so schnell wie möglich sein.

Andere Tipps

Ich sehe nicht, wie const-Modifikatoren wären wirklich ein Problem sein.

Welche Mitglieder Ihrer QAbstractItemModel derivate würden Sie ändern möchten, wenn rowCount, index, columnCount und data Methoden aufgerufen werden? Sie können sehr gut speichern Sie einen Verweis auf Ihre Karte, und berechnen alles von ihm. Keine Notwendigkeit, die Karte ändert sich die benötigten Informationen zu extrahieren (soweit ich sagen kann!).

EDIT nach EDIT1 und Kommentare :
Wenn Ihre Karte zu modifizierenden gebunden ist, verwenden Sie es als Grundstruktur in der eigenen Klasse. Wenn Sie nicht einen Verweis auf Ihre Karte halten können, weil die Lebensdauer des Modells könnte die Karte ab, indem Sie intelligente Zeiger überschreiten, um sicherzustellen, ist es nicht passieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top