2016-07-14 5 views
0

Ich habe zwei QTreeViews.Wie kann ich QStandardItemModels in einem QTreeView organisieren?

Zuerst (QTreeView1) angezeigte Ordner, zweite (QTreeView2) - angezeigte Unterordner, die auf Ordner geladen werden klicken Sie in der ersten QTreeView1. Nach dem Klick auf den Ordner in QTreeView1 erstelle ich QStandardItemModel mit Unterordnern und setze dieses Modell auf QTreeView2. Außerdem sind alle Elemente in beiden QTreeViews überprüfbar und ich möchte alle markierten Objekte speichern. Wie kann ich den Modellspeicher für jeden geladenen Ordner organisieren? ist, sollte es so etwas wie dieses:

// store folder model on subfolders check state changed 
QMap<QStandardItemModel*, QString> modelStorage; 
modelStorage.push_back(folderModel, folderPath); 

und Restore-Ordner auf Ordner klicken Sie einfach:

QStandardItemModel* findFolderModel(QString folderPath) 
{ 
    QStandardItemModel* model; 
    foreach(auto path, modelStorage) 
    { 
     if (path == folderPath) 
     { 
      model = modelStorage.find(folderPath); 
     } 
     else model = nullptr; 
    } 

    return model; 
} 

und zeigen Modell dann ... Ist es richtig Weg, um alle Ordner Modelle zu speichern? oder muss es dynamisch geladen werden? Aber in diesem Fall muss ich alle Modelldaten selbst speichern (zum Beispiel überprüfte Artikel). Auch Modelldaten können für eine Weile geändert werden und ich kann "korrekte" Daten nicht anzeigen, wenn ich das Modell von "Schnappschüssen" wiederherstelle.

UPD auch ich habe eine Frage über die Umsetzung meines Vorschlags: Ich speichere/Modelle auf Klick von Ordnern in QTreeView1 wiederherstellen und es scheint, gearbeitet zu werden ... aber wieder Modelle enthalten nicht/Displays QStandardItems. Es passiert, weil treeItem mit einem neuen Operator im lokalen Bereich zugeordnet ist? Wie kann ich in diesem Fall alle QStandardItems in jedem Modell speichern?

model = new QStandardItemModel; 
QStandardItem* treeItem = new QStandardItem("item"); 
model->appendRow(treeItem); 
//.. 
modelStorage.insert(folderItem, model); 
ui.treeView->setModel(model); 
// after restore model pointer is valid, but hadn't contains any items. 

Antwort

1

Ich denke, können Sie versuchen, zwei QFileSystemModels für beide QTreeViews zu bedienen und schaffen keine QStandardItemModel jedes Mal, wenn Element klicken in erster QTreeView. Wie Sie in der Dokumentation sehen können, QFileSystemModel haben setRootPath Methode. Sie können diese Methode für jedes zweite Modell verwenden, wenn Sie auf den Ordner in der ersten QTreeView klicken.

Um Ihre Artikel überprüfbar, nach diesem hilfreichen Artikel zu machen:

http://www.qtcentre.org/threads/27253-QFileSystemModel-with-checkboxes

QFilesystemmodel with Checkboxes

http://doc.qt.io/qt-5/qidentityproxymodel.html

+0

Thx für den Rat, aber es ist mein Fehler, dass ich nicht erklären habe, dass Ordner und Unterordner ist nicht Dateisystemstruktur ... seine Ordner von bestimmter Datenbank und ich muss QStandardItemModel erstellen und manuell füllen. Eine Entscheidung für diesen Fall? –

+1

In diesem Fall, denke ich, können Sie nur ein QStandardItemModel verwenden. Für den ersten QTreeView zeigen Sie alle Ihre Ordner dieses Modells an. Für das zweite QTreeView verwenden Sie eine Neuimplementierung von QSortFilterProxyModel (unter QStandardItemModel), um die Quelle QStandardItemModel nach einem bestimmten Ordner zu filtern, den Sie aus dem ersten QTreeView ermitteln. –

+0

amm) thx wieder, aber die Struktur in QTreeView1 enthält keine Unterordner von QTreeView2. Es ist anders, weil Ordner von QTreeView1 faul lädt, wenn es benötigt wird. Und das ist der Grund, warum ich nicht alle Daten in einem Modell speichern kann (Zeit, ganze Datenbank zu laden). Es motiviert mich teilen Modelle auf Ordner Modell mit "Schlüssel" und Unterordner Modelle mit Elementen für Schlüssel in QTreeView1 Modell) Haben Sie eine Meinung dazu? –

Verwandte Themen