QSettings und verschachtelte (mehrdimensionale) Arrays

Alles rund um die Programmierung mit Qt
Antworten
griffin27
Beiträge: 12
Registriert: 13. Februar 2009 15:20

QSettings und verschachtelte (mehrdimensionale) Arrays

Beitrag von griffin27 »

Hallo,

ich hatte versucht, eine Liste von abgeleiteten QGraphicsItems, die durch eine Liste von Punkten definiert werden, in eine QSettings ini-Datei zu schreiben.
Das schreiben funktioniert ja, aber das zurücklesen leider nicht.
Ich hab in der Doku nichts darüber gefunden, ob etwa Verschachtelte Arrays nicht unterstützt werden.

Hier die geschriebene ini-Datei:

Code: Alles auswählen

[Cutouts2]
size=2
1\pageName=Seite1
1\Seite1\size=4
1\Seite1\1\scenePoint=@Point(708 1256)
1\Seite1\2\scenePoint=@Point(2365 1296)
1\Seite1\3\scenePoint=@Point(2138 219)
1\Seite1\4\scenePoint=@Point(2403 2697)
2\pageName=Seite2
2\Seite2\size=4
2\Seite2\1\scenePoint=@Point(2436 1544)
2\Seite2\2\scenePoint=@Point(4115 1566)
2\Seite2\3\scenePoint=@Point(3866 256)
2\Seite2\4\scenePoint=@Point(4235 2746)
Und hier die Methode zum auslesen:

Code: Alles auswählen

void MainWindow::loadFromDrawingsFile()
{
    QString drawingFN = fileName + ".ptp"; // extension stands for photo to page
    QSettings set(drawingFN, QSettings::IniFormat, this);
    qDebug() << __func__ << " with " << drawingFN;

    // delete all drawing items
    removeDrawings();

    int size = set.beginReadArray("Cutouts2");
    qDebug()<<"size = " << size;
    for(int i=0; i<size; i++){
        set.setArrayIndex(i);
        Cutout2Page co;
        co.pageName = set.value("pageName").toString();
        qDebug()<<"pageName = " << co.pageName;
        co.cutout = new Cutout2(0, ui->graphicsView->getScene());

        int sizeP = set.beginReadArray(co.pageName);
        qDebug()<<"sizeP = " << sizeP;
        for(int ii=0; ii<sizeP; ii++){
            set.setArrayIndex(ii);
            QPointF p = set.value("scenePoint").toPoint();
            qDebug()<< "read point["<<ii<<"] = "<<p;
            co.cutout->addPoint(p);
        }
        cutouts2.append(co);
        qDebug() << "loaded " << co.cutout;
    }
}
Auszug aus der mainwindow.h Klassendeklaration:

Code: Alles auswählen

private:
    ...
    struct Cutout2Page{
        Cutout2* cutout;
        QString pageName;
    };

    QList<Cutout2Page> cutouts2;
    ...
Hier die debug-Ausgaben dazu:

Code: Alles auswählen

loadFromDrawingsFile  with  "/home/karl/Karl/Literatur/Physik/Effekte der Physik/session 1/ausschuss/062 DSC07286.JPG.ptp" 
removeDrawings 
size =  2 
pageName =  "Seite1" 
sizeP =  4 
read point[ 0 ] =  QPointF(708, 1256) 
read point[ 1 ] =  QPointF(2365, 1296) 
read point[ 2 ] =  QPointF(2138, 219) 
read point[ 3 ] =  QPointF(2403, 2697) 
loaded  QGraphicsItem (this = 0x22fe630 , parent = 0x0 , pos = QPointF(708, 1256) , z = 0 , flags =  ( ItemIsMovable | ItemIsSelectable ) ) 
pageName =  "" 
sizeP =  0 
loaded  QGraphicsItem (this = 0x21ac090 , parent = 0x0 , pos = QPointF(0, 0) , z = 0 , flags =  ( ItemIsMovable | ItemIsSelectable ) ) 
Wie man sieht, wird der pageName im 2. Durchgang nicht ausgelesen.
Als Workaround werde ich versuchen, die key-struktur selber zu genereieren, und die values so dann wieder auszulesen.
Bemerkenswert ist hier vielleicht, dass für das Hauptarray eine Group angelegt wird ([Cutouts2]) und für das Subarray nicht so direkt. Laut Doku kann man Groups verschachteln, ich hab aber nicht ausprobiert, wie das dann in einem ini-file dargestellt wird.

Ich wünsche allen noch frohe Festtage und einen guten Rutsch ins Jahr 2015
lg, Karl
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: QSettings und verschachtelte (mehrdimensionale) Arrays

Beitrag von veeman »

Wenn du beginnArray verwendest dann musst du auch endArray benutzen um das Ende zu definieren, sonst verlässt er die Rekursionsebene nicht.
griffin27
Beiträge: 12
Registriert: 13. Februar 2009 15:20

Re: QSettings und verschachtelte (mehrdimensionale) Arrays

Beitrag von griffin27 »

hui, fast peinlich. Danke für den Tipp!
In der Zwischenzeit hatte ich es mit begin/endGroup umgangen das Problem.

Aber auch diese Version funktioniert nun (inzwischen hat sich ein wenig an der Struktur geändert, soll aber hier nicht iritieren):

Code: Alles auswählen

void MainWindow::loadFromDrawingsFile()
{
    bool ok;
    QString drawingFN = fileName + ".ptp"; // extension stands for photo to page
    QSettings set(drawingFN, QSettings::IniFormat, this);
    qDebug() << __func__ << " with " << drawingFN;

    // delete all drawing items
    removeDrawings();

    int size = set.beginReadArray("RotatedRectangles");
    qDebug()<<"size = " << size;
    for(int i=0; i<size; i++){
        set.setArrayIndex(i);

        RotatedRect* rr;
        QString name = set.value("name").toString();
        qDebug()<<"name = " << name;
        rr = new RotatedRect(0, ui->graphicsView->getScene());
        rr->name = name;
        rr->type = (RotatedRect::Type)(set.value("type").toInt(&ok));
        if(!ok) qDebug() << "Error on reding Int in "<< __FILE__<<":" << __LINE__;

        int sizeP = set.beginReadArray(name);
        qDebug()<<"sizeP = " << sizeP;
        for(int ii=0; ii<sizeP; ii++){
            set.setArrayIndex(ii);
            QPointF p = set.value("scenePoint").toPoint();
            qDebug()<< "read point["<<ii<<"] = "<<p;
            rr->addPoint(p);
        }
        set.endArray();
        rotRects.append(rr);
        qDebug() << "loaded " << rr;
    }
    set.endArray();
}
Antworten