Speichern/Laden einer Scene

Alles rund um die Programmierung mit Qt
Antworten
Scientist
Beiträge: 4
Registriert: 12. September 2006 13:39

Speichern/Laden einer Scene

Beitrag von Scientist »

Hallo, liebe Kollegen

Mein erster Beitrag in diesem großartigen Forum ;-)

Ich benötige eine Lösung um eine fertige QGraphicsScene, die bereits mit Items vollgestopft ist, in ein file zu speichern, bzw. auch wieder zu laden. Wie geht das? Ich beschäftige mich erst seit wenigen Wochen mit Qt/C++.
Bitte seid nicht so hart mit mir, falls die Frage dämlich ist ...

Liebe Grüße,
Sci
rmeeh
Beiträge: 32
Registriert: 10. September 2006 18:59
Wohnort: Geislingen
Kontaktdaten:

Beitrag von rmeeh »

Hallo,
ich kenne Die Klasse nicht so gut, da ich normalerweise mit QT 3.3 arbeite. Aber ich habe gesehen, daß es eine Methode gibt, die eine QList zurückliefert. Diese müßte doch eigentlich brauchbar zu serialisieren sein. Ich weiß nicht genau, ob Dir dieser Ansatz hilft, dazu kenne ich die Klasse zu wenig, aber das fiel mir spontan dazu ein.

Gruß Ralf
Kein Tag kommt wieder, vergessene Fehler schon....
Scientist
Beiträge: 4
Registriert: 12. September 2006 13:39

Beitrag von Scientist »

Hallo Ralf

Vielen Dank für Deine Antwort. Ich bin allerdings nicht ganz sicher, was Du meinst. Wir reden über die items()-Methode, nehme ich an. Ein entsprechende Aufruf liefert eine QList mit allen Objecten in der Scene. Soweit so gut. Mir ist allerdings nicht klar, wie ich nun weiter verfahren muss, denn wenn ich das ganze in ein file packen will, muss ja auch die jeweilige Position, die Orientierung, etc. mitgespeichert werden. Ähnliches gilt beim Laden, denn da soll ja die ganze Scene rekonstruiert werden. Vermutlich ist das irgendwie möglich, scheint aber doch eine recht komplexe Angelegenheit zu sein. Sehe ich das richtig? Im Fall einer Pixmap etwa ist das Speichern und Laden ja im Grunde nur ein einzelner Aufruf. Warum geht sowas bei einer Scene nicht?

Liebe Grüße,
Sci
rmeeh
Beiträge: 32
Registriert: 10. September 2006 18:59
Wohnort: Geislingen
Kontaktdaten:

Neuer Ansatz

Beitrag von rmeeh »

Hallo Sci
Ok, da hast Du recht, das ist zu umständlich!!!
Was hältst Du von dem Ansatz:
Versuch mal Dein Objekt direkt zu serialisieren, vielleicht macht QT das Spiel mit, wie gesagt, ich kanns leider nicht testen. Ich habe nur V3.3 am laufen und Deine Klasse gibts erst seit QT 4.2
Beispiel:
bool Spreadsheet::writeFile(const QString &fileName)
{
QFile file(fileName);
if (!file.open(IO_WriteOnly)) {
QMessageBox::warning(this, tr("Spreadsheet"),
tr("Cannot write file %1:\n%2.")
.arg(file.name())
.arg(file.errorString()));
return false;
}

QDataStream out(&file);
out.setVersion(5);

out << (Q_UINT32)MagicNumber; // Hier nur als Beispiel.......
*****oder halt z.B. out<<(QSTRING)DeineGrafik;

return true;
}

Sollte das gehen, kriegst Du alles auch wieder auf diesem Weg zurück.
Weißt Du was ich meine?

Gruß Ralf
Kein Tag kommt wieder, vergessene Fehler schon....
Scientist
Beiträge: 4
Registriert: 12. September 2006 13:39

Beitrag von Scientist »

Hi Ralf

Vielen Dank für die Unterstützung. Leider spielt Qt nicht mit. Es wird zwar "irgendwas" in das file geschrieben ... allerdings ist das "irgendwas" insbeondere nicht wieder in eine QGraphicsScene hineinzubekommen. Sieht wohl so aus, als müßte ich mir doch ein eigenes fileformat ausdenken und dann alles schön von Hand programmieren ... das Leben ist schön :-(

Kennst Du noch einen anderen Trick, den man mal versuchen könnte?

Liebe Grüße,
Sci
rmeeh
Beiträge: 32
Registriert: 10. September 2006 18:59
Wohnort: Geislingen
Kontaktdaten:

Beitrag von rmeeh »

Hi Sci,
ja, ich habe nicht nur noch einen Trick, sondern vielleicht meinen Denkfehler entdeckt.
Dass das Programm so schon mal "etwas" schreibt ist doch ein kleiner Anfang. Nur habe ich Esel Dir ausgerechnet angeraten das ganze in einen QString zu schreiben. Wenn Du über die Darstellung eines solchen nachdenkst mußte das schiefgehen. Wir müßen versuchen die Daten als "RAW" zu schreiben. Dazu könnte sogar der Datentyp Unsigned Int32 (also der in der oberen Beispielzeile) gehen. Unser QString ist aus Unicode Zeichen aufgebaut. Also unsigned char oder unsigned Int32. Ich bin mir fast sicher, daß wir hier nur noch am passenden Datentyp knabbern.Ich meine der Versuch wäre es mal wert. PS: Ich habe heute Abend einen "etwas angestaubten" älteren AMD Rechner aus der Ecke gezogen und ein Linux 10.1 drauf installiert. Nun guck ich mal nach QT4.2 und versuch das zu Laufen zu bringen. Jetzt bin ich nämlich schon neugierig geworden. Vielleicht schreibe ich mal ein kleineres Projekt damit ums anzutesten. (Soll ein kleines einfaches Chatprogramm für mein internes Netz mit 11 Rechnern geben) neee, ich arbeite nicht mit 12 Rechnern gleichzeitig, mir selbst gehören 6 davon, da gehören aber der NT-Server, der Router und der ominöse alte AMD auch dazu. Ist halt mein Hobby, andere gehen Ski fahren ;-)
Also probier mal ein paar andere Datentypen für das Type-Casting, vielleicht stellt sich der Erfolg schneller ein als erwartet.
-Grüße Ralf- :lol:
Kein Tag kommt wieder, vergessene Fehler schon....
Scientist
Beiträge: 4
Registriert: 12. September 2006 13:39

Beitrag von Scientist »

Hi Ralf!

Na, das klingt ja ganz positiv. Ich bekomme langsam das Gefühl, dass ich Qt fast zu "vorsichtig" behandele. Ich verbringe viel Zeit in der Doku, statt einfach auszuprobieren ... muss ich mal ändern! Sorry übrigens für die späte Antwort, am Wochenende war ich weg.

Nun: Heute und morgen werde ich nicht zum Coden komme, wie es aussieht. Aber ich probiere es auf jeden Fall aus. Wäre doch einfach zu schön, wenn das funktionieren würde. Ich danke Dir ganz herzlich dafür, dass Du Dich meines Problems annimmst!

Ich dachte schon, Du würdest mit 12 Rechnern arbeiten. Aber wenn's tatsächlich nur 6 sind, geht's ja noch ;-) Moment, ich zähle gerade mal in meinem Haus durch ..... äähm ... Moment noch ....... so jetzt hab ichs: Eins ;-)

Wie auch immer: Ich werde mal mit den Datentypen rumbasteln und melde mich dann ... hoffentlich erfolgreich. Wenn Du etwas erreichen kannst, "darfst" Du mir gerne sagen, wie es geht. Bis dahin!

Liebe Grüße,
Sci
rmeeh
Beiträge: 32
Registriert: 10. September 2006 18:59
Wohnort: Geislingen
Kontaktdaten:

Noch nichts neues

Beitrag von rmeeh »

Hallo SCI,
sorry daß ich mich eut erst melde. Ich war die letzten Tage beruflich recht eingespannt, da wir eine Teilabnahme von der Bauleitung hatten , das Parkhaus hat heute seinen Teilbetrieb aufgenommen......
Nee, ich hab noch nichts neues, außer daß QT4 für mich sehr "komisch" zu bedienen ist. Bis ich das mal sauber in mein Visual Studio 6 eingebunden hatte.....
Heute kam ich auch noch zu nichts, außer Einkaufen, Klamotten und so was ;-) für den Winter, Motorrad auf den Winter vorbereiten.....
Aber nun zum Problem zurück:
Also erstens brauchst Du QT nun wirklich nicht zimperlich anfassen, "eine Überlegung->einVersuch->ein Test->geht oder geht nicht...." Gut unser erstere ersten Versuche gingen nicht, wie gesagt ich vermute folgendes: Die von uns zur serialisierung verwendeten Datentypen haben das Problem daß sie einen konstant bleibenden Datentyp verwenden, Deine Scene ist aber von variabler Länge. Nun kriegen wir spätestens beim Einlesen Konvertierungsfehler. Hast Du Dir die Datei mal angesehen, was dort so reingeschrieben wird? Meine nächste Idee, ist eine Byteweise Serialisierung die aber das Problem nicht ganz behebt, da wir ja keine ItemEnden erkennen könne, also auch shi**-Nun kam mir aber ein programmtechnisch aufwendigerer aber "sauber zu realisierender" Gedanke (halt kein Quick Hack), der aber so zum Ziel führen müßte: Du baust eine Klasse "SerializeScene" der Du die Scene übergibst. Nun generierst Du eine Itemlist, die arbeitest Du Item für Item ab, und schiebst das ganze in einen QDataStream, nicht ohne am Anfang die Itemliste mit dortrein zu schieben. Zurückgeben kannst Du den Inhalt des Streams oder Du speicherst den gleich weg, dann ußt Du halt noch Pfad und Name mit an die Klasse geben oder dort mit einem QFileDialog abfragen. Wenn Du nun den Stream zurückliest, stehen dort am Anfang die Items und Du weißt wie Du Ihn wieder zu zerlegen hast. Damit hast Du zwar einmal den Programmieraufwand für die Klasse aber später nie wieder ärger wenn Du das in einem ähnichen Programm brauchst. Außerdem lässt sich diese Klasse dann für fast jeden Datentyp abwandeln. Was hältst Du von der Idee??
--Gruß Ralf--
Kein Tag kommt wieder, vergessene Fehler schon....
Antworten