Baumstruktur (QTreeWidget) in Datenbank speichern?

Alles rund um die Programmierung mit Qt
Antworten
cyberduck
Beiträge: 16
Registriert: 14. Juli 2010 12:07

Baumstruktur (QTreeWidget) in Datenbank speichern?

Beitrag 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?
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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....
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag 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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ....
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Re: Baumstruktur (QTreeWidget) in Datenbank speichern?

Beitrag 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 ...
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
cyberduck
Beiträge: 16
Registriert: 14. Juli 2010 12:07

Beitrag 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 
        */
    }
}
Antworten