Seite 1 von 1

Baumstruktur (QTreeWidget) in Datenbank speichern?

Verfasst: 12. Mai 2011 15:39
von cyberduck
Hallo

wie kann ich die Baumstruktur von einem QTreeWidget in einer Datenbank speichern?

Ich habe mir dazu auch schon das Beispiel "editabletreemodel" angeschaut, was für mich aber relativ komplex und deshalb unverständlich ist. Im Grunde macht es aber genau dass was ich möchte, nur das die Daten aus einer Datei gelesen werden, aber nicht zurückgeschrieben.

Welche Felder/Informationen würde ich in der Datenbank bzw. einem Datensatz benötigen:

1.) Name des Elements
2.) Spalte des Elements(column)
3.) Reihe des Elements(row)
4.) Parent des Elements(row)

Soweit meine Idee, dann habe ich aber auch noch etwas von Nested Sets-Modell gelesen, was mir nicht wirklich weiter geholfen hat, da mir nicht klar ist wie ich es mit dem QAbstractItemModel umsetzen kann.

Kann mir jemand ein paar Tipps geben, oder kennt sogar ein HowTo für Qt dazu?

Verfasst: 15. Mai 2011 10:15
von padreigh
du könntest es als xml wegspeichern :

Code: Alles auswählen

DB
|-- Baum
|   |-- Buche
|   |-- Eiche
|   `-- Linde
|-- Berg
|   |-- Blocksberg
|   |-- Huegel
|   |   |-- Huegel1
|   |   |-- Huegel2
|   |   `-- Huegel3
|   `-- Mittelgebirge
`-- Stadt
    |-- Aachen
    |-- Nuernberg
    `-- Zirchau

Code: Alles auswählen

<DB>
    <Baum>
        <Buche></Buche>
        <Eiche></Eiche>
        <Linde></Linde>
    </Baum>
    <Berg>
        <Blocksberg><Blocksberg>
        <Huegel>
            Huegel1,Huegel2,Huegel3
        </Huegel>
        <Mittelgebirge></Mittelgebirge>
    </Berg>
    <Stadt>
        <Aachen></Aachen>
        <Nuernberg></Nuernberg>
        <Zirchau></Zirchau> 
    </Stadt>
</DB>
oder halt:

Code: Alles auswählen

<node name="DB">
    <node name="Baum">
        <node name="Buche>
        </node>
usw.

Vom TreeWidget dahin kommst du im prinzip indem du beim rootitem anfängst, dann immer tags aufmachst, alle kinder (und deren Kinder und deren kinder) reinschreibst usw....

Verfasst: 16. Mai 2011 08:26
von Exasperation
Ich verweise bei solchen Fragen gerne auf die boost Bibliothek. Schau dir da mal Serialisierung an. Bietet Speicherung der (beliebig gearteten) Daten in binärer, textueller oder auch XML-Form an.

Verfasst: 16. Mai 2011 11:12
von RHBaum
Ich glaub mit Datenbank meint der TE ein relationales Datenbank-Modell :shock:

XML und binäre Abbilder helfen ihm da wenig.
Genau so der hinweis auf ein Serialize-Interface. Das Schreiben in die DB muesst er selbst da selber implementieren ...

@TE
wenn du relationale Modelle meinst:
Baumstrukturen = Parent-Child Beziehungen in der relationalen Welt.
Werden meistens ueber eine externe Beziehungstabelle modelliert.
d.h. du hasst deinen Datensatz, der hat unter anderem seinen Primaeren Index (Primary Key - PK)
Die beziehungen werden dann extra in ner Parent-Child-Tabelle angelegt, die hat z.b. folgenden aufbau
PK (der Bezihungstabelle)
Child (PK des Cild elementes)
Parent(PK des Parents)

Prinzip verstanden ?

Ciao ....

Re: Baumstruktur (QTreeWidget) in Datenbank speichern?

Verfasst: 16. Mai 2011 17:43
von padreigh
cyberduck hat geschrieben:Hallo

wie kann ich die Baumstruktur von einem QTreeWidget in einer Datenbank speichern?

Ich habe mir dazu auch schon das Beispiel "editabletreemodel" angeschaut, was für mich aber relativ komplex und deshalb unverständlich ist. Im Grunde macht es aber genau dass was ich möchte, nur das die Daten aus einer Datei gelesen werden, aber nicht zurückgeschrieben.
Ich bin daher auf Datei gekommen ... mal sehn was der TE sagt ...

Verfasst: 23. Mai 2011 17:41
von cyberduck
Hallo,

danke für die vielen Tipps. Ja mit Datenbank meine ich ein relationales Datenbank-Modell. Ich bin auch schon ein Stück weiter, allerdings habe ich noch ein kleines Problem. Beim erstellen der Baum-Struktur werden die Knoten nicht korrekt hinzugefügt. Kann mir jemand helfen, damit die Funktion richtig arbeitet?

Die Tabelle in der DB sieht so aus:

Code: Alles auswählen

EntrieID...ParentID...Name
1.............0..............Eintrag 1
2.............0..............Eintrag 2
3.............2..............Folgeeintrag 1
12...........0..............Eintrag 3
14...........2..............Folgeeintrag 2
15...........2..............Folgeeintrag 3
16...........14............Unter Folgeeintrag 2, Eintrag 1
17...........14............Unter Folgeeintrag 2, Eintrag 2
18...........14............Unter Folgeeintrag 2, Eintrag 3
Den Baum erstelle ich über die folgende Funktion:

Code: Alles auswählen

addTree(0);

void MainWindow::addNodes(int id){
    QList<Entries*> entries = db->getEntries(id); //SELECT * FROM entries WHERE ParentID='" + QString::number(id) + "' ORDER BY ParentID"
    QTreeWidgetItem *currentItem, *parent;
    MyTreeWidgetItem *item;

    foreach(Entries* entrie, entries){

        int parent_id = entrie->getParentID();
        item=0;

        if( !treeWidget->topLevelItemCount() || !parent_id ){
            item=new MyTreeWidgetItem(treeWidget);
        }else{
            currentItem = treeWidget->currentItem();
            parent = currentItem->parent();

            if( id==parent_id && parent){
                item=new MyTreeWidgetItem( parent );
            }else{
                item=new MyTreeWidgetItem( currentItem );
            }
        }

        if(!item){
            continue;
        }

        item->setEntries(entrie);
        item->setText(0, entrie->getName());
        item->setIcon(0, QIcon(":/folder.ico") );
        treeWidget->setCurrentItem(item);

        this->addNodes(entrie->getID()); //getID() == EntrieID
        
        qDebug() << "ID " << id;
        qDebug() << "Folder-ID " << entrie->getID();
        qDebug() << "Parent-ID " << parent_id;
        
        /*
        Die kompletten Debug-Ausgaben
        ID  0 
        Folder-ID  1 
        Parent-ID  0 
        ID  0 
        Folder-ID  2 
        Parent-ID  0 
        ID  2 
        Folder-ID  3 
        Parent-ID  2 
        ID  2 
        Folder-ID  14 
        Parent-ID  2 
        ID  14 
        Folder-ID  16 
        Parent-ID  14 
        ID  14 
        Folder-ID  17 
        Parent-ID  14 
        ID  14 
        Folder-ID  18 
        Parent-ID  14 
        ID  2 
        Folder-ID  15 
        Parent-ID  2 
        ID  0 
        Folder-ID  12 
        Parent-ID  0 
        */
    }
}