Costruzione di Interfacce Lezione 24 SDL&QT, Scene Graphs e Xml for dummies

Documenti analoghi
.pro files. Moebius3ds.pro. default.pro. SDL e QT. .pro details. Come migliorare l integrazione tra.net e designer.

XML. XML e linguaggi oo. Esempio. Xml in pratica. <managed c++> <managed c++>

Introduzione. Memory leaks. Vcg/Xml. Usiamo lo SceneGraph CSG. XML read e write Scene Graph design Adattare lo scene graph

Skeleton SDL. Skeleton SDL. Obiettivo. Aggiungiamo un cubo. DrawBlock. Costruzione di Interfacce Lezione 9 Esercitazione Trasformazioni

GAME DEV: tools programming. Parte 2: programming

LEZIONE BASI DI DATI I 22/10/2008 XML

Laboratorio di sistemi interattivi. Struttura di un applicazione Java-XML. Lezione 12: Java & XML

Hello GL. subclassiamo. subclassiamo. Primo tentativo. Costruzione di Interfacce Lezione 20 Qt + Opengl

Elaborazione di documenti XML

Variabili e Funzioni. Informatica 1 / 19

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Corso di Grafica Computazionale

Introduzione. Costruzione di Interfacce Primi passi in OpenGL. Sierpinski Gasket. Sierpinski gasket. Event driven programming. Stuttura del programma

Laboratorio di reti II: Extensible Markup Language

Le funzioni: la dichiarazione

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Breve Introduzione a XML

Lezione 6 Introduzione al C++ Mauro Piccolo

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Estensioni Opengl. Estensioni Opengl. Opengl 1.2 e 1.3. Come si usano

I Formati per l'interscambio dei Dati XML, Json, YAML,...

INFORMATICA AA Università degli Studi di Ferrara Facoltà di Scienze MM FF NN Corso di Laurea in «Scienze e Tecnologie per i Beni Culturali»

Programmazione lato client. JavaScript. Applicazioni di Rete M. Ribaudo - DISI. JavaScript

Introduzione. Costruzione di Interfacce Primi passi in OpenGL. Sierpinski Gasket. Sierpinski gasket. Event driven programming. Stuttura del programma

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Argomenti XML JSON. Linguaggi per la definizione e lo scambio di dati strutturati, semi-strutturati, non strutturati. XML Data Model JSON

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

JavaScript JavaScript Programmazione lato client JScript JavaScript ECMAScript

SOMMARIO: linguaggio xml. Contenuti. A cura dell Ing. Buttolo Marco INTRODUZIONE...2 STRUTTURA DOCUMENTO XML...2 VISUALIZZAZIONE DOCUMENTI XML...

Implementazione dell albero binario in linguaggio C++

SAX e DOM. Analisi di un documento

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Introduzione al C++ Corso di C++ INFN LNS 13 Dicembre Corrado Santoro

XML Programming: DOM e SAX

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

C: panoramica. Violetta Lonati

Informatica 3. LEZIONE 17: Alberi generici. Modulo 1: Definizione e ADT Modulo 2: Implementazione Modulo 3: Alberi e classi di equivalenza

Fondamenti di Informatica

Struttura di un programma C++

Laboratorio Informatica Classe 4A Serale Venerdì 18/02/2011. Gruppo. Cognome Riontino Nome Raffaele. Cognome Nome

Cominciamo ad analizzare la rappresentazione delle informazioni... di Cassino. C. De Stefano Corso di Fondamenti di Informatica Università degli Studi

Un tipo di dato astratto (ADT) definisce una categoria concettuale con le sue proprietà: una definizione di tipo

Concetto di stream. c i a o \0. c i a o \0. c i a o \0

Template (1) Molte volte l operato di una funzione o le proprietà di una classe non dipendono dal tipo dei dati coinvolti

Informatica 3. Informatica 3. LEZIONE 17: Alberi generici. Lezione 17 - Modulo 1. Introduzione. ADT dell albero generico.

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Dati due punti sul piano calcolare la loro distanza

Passaggio dei parametri. Passaggio dei parametri

Prof. Pagani corrado XML

Introduzione al linguaggio C Puntatori

L albero e un tipo astratto di dati usato per rappresentare relazioni gerarchiche.

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)

L AMBIENTE CODE BLOCKS E L IO

Scritto di Algoritmi e s.d. (1o anno) 16 Gennaio 2004 TESTO E RISPOSTE

Alberi ( GT. 7 ) In informatica, un albero è un modello astratto con cui viene rappresentata una struttura gerarchica

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Elementi di Base. Introduzione a Python.

UNIVERSITA DEGLI STUDI ROMA TRE DIPARTIMENTO DI MATEMATICA E FISICA

Il parser kxml. Francesca Martelli

Il linguaggio C. Notate che...

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Struttura di un programma Java

Il linguaggio C. Puntatori e dintorni

Fondamenti di Informatica 1 - Compito A

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e Polimorfismo

Fondamenti di Informatica II 3. Funzioni in C++ (parte 1)

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

dott. Sabrina Senatore

Programmazione Procedurale in Linguaggio C++

La Standard Template Library Heap, algoritmi e funtori

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Introduzione Programmazione Java

Ho raggiunto la fine del file Provo a leggere un intero, ma il dato che prelevo dal file non è un intero

Sistemi operativi A, Unix+C, 26/09/2017. Nome: Cognome: Matricola:

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Fondamenti di Informatica 2

Programmazione Orientata agli Oggetti

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Introduzione al linguaggio C Primi programmi

Programmazione A.A Costrutti di base. ( Lezione XII, parte I ) Gestione dell input. Prof. Giovanni Gallo Dr.

Input. Il tipo char Alcune modalità di acquisizione di input. Laboratorio di Programmazione - Luca Tesei

Java: Definire Classi e Creare Oggetti

Il paradigma OO e le Classi

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

C# delegates. Vittorio Maniezzo Università di Bologna. Vittorio Maniezzo Università di Bologna 1. Delegate

I Fondamenti del Linguaggio

Esame di Ingegneria del software Appello del 16 febbraio 2018

Programmazione con Java

Transcript:

Costruzione di Interfacce Lezione 24 SDL&QT, Scene Graphs e Xml for dummies cignoni@iei.pi.cnr.it http://vcg.iei.pi.cnr.it/~cignoni Costruzione di Interfacce - Paolo Cignoni 1

SDL e QT vogliamo integrare alcune feature di SDL con QT SDL gestisce molto bene: fullscreen e resize modalita video QT gestisce molto bene loading immagini parsing xml ecc. facciamo un mix dei due Costruzione di Interfacce - Paolo Cignoni 2

SDLMoebius.pro TEMPLATE = app CONFIG += console debug release opengl INCLUDEPATH +=.;c:\code\sdl-1.2.6\include LIBPATH += c:\code\sdl-1.2.6\lib unix:libs += -lmath -L/usr/local/lib win32:libs += sdlmain.lib sdl.lib # Input HEADERS += vcg\matrix44.h vcg\point3.h vcg\point4.h vcg\utility.h SOURCES += main.cpp CIMoebius.cpp Costruzione di Interfacce - Paolo Cignoni 3

main.cpp int main(int argc, char **argv) { QApplication QApp(argc, argv ); SDL_Init(SDL_INIT_VIDEO) < 0 ); SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 24); SDL_SetVideoMode(640, 480, 0, SDL_OPENGL SDL_FULLSCREEN); CIMoebius::myShape s; s.buildngon(3,1); ring.generatemoebiusring(s,36,3,120); int done = 0, ret; myglreshapefunc(640,480);... Costruzione di Interfacce - Paolo Cignoni 4

main.cpp while (! done ) { SDL_Event event; ret=sdl_pollevent(&event); if(ret) switch(event.type){ case SDL_QUIT : done = 1; break ; case SDL_KEYDOWN : if ( event.key.keysym.sym == SDLK_ESCAPE ) done = 1; if ( event.key.keysym.sym == SDLK_SPACE ) QMessageBox::information(0,"asdfads","Asdfadsf"); break; case SDL_VIDEORESIZE : SDL_SetVideoMode(event.resize.w,event.resize.h,0,SDL_OPENGL SDL_FULLSCREEN); myglreshapefunc(event.resize.w,event.resize.h); break; } else DrawGLScene(); } SDL_Quit(); return 1; } Costruzione di Interfacce - Paolo Cignoni 5

main.cpp, InitGL QImage tt; tt.load("texture.png"); QImage tx = QGLWidget::convertToGLFormat ( tt); printf("qimage loaded %i %i \n",tt.size().width(),tt.size().height()); GLuint texname; glgentextures(1, &texname); glbindtexture(gl_texture_2d, texname); glteximage2d( GL_TEXTURE_2D, 0, 3, tx.width(), tx.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tx.bits() ); glubuild2dmipmaps(gl_texture_2d, 3, tx.width(), tx.height(), GL_RGBA, GL_UNSIGNED_BYTE, tx.bits() ); glenable(gl_texture_2d); gltexenvi(gl_texture_env, GL_TEXTURE_ENV_MODE, GL_MODULATE ); gltexparameteri (GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); gltexparameteri(gl_texture_2d,gl_texture_mag_filter,gl_linear); Costruzione di Interfacce - Paolo Cignoni 6

XML Cos è XML? acronimo di extensible Markup Language è un linguaggio estensibile realizzato per poter definire ed utilizzare in modo semplice documenti strutturati Nato e studiato per il Web, Molto utile al difuori del contesto web per definire generici formati di interscambio di dati. XML è molto di più di quello che vedrete qui Costruzione di Interfacce - Paolo Cignoni 7

Esempio xml <?xml version="1.0" encoding="utf-8"?> <business-card> <persona> <titolo> Sig. </titolo> <nome> Mario </nome> <cognome> Rossi </cognome> </persona> <indirizzo> <strada> Via Verdi </strada> <numero-civico> 12 </numero-civico> <cap> 56100 </cap> <citta> Pisa </citta> </indirizzo> </business-card> Costruzione di Interfacce - Paolo Cignoni 8

Xml Basato sull uso di markup per delimitare porzioni del documento Un mark-up è quello compreso tra <> Detto anche tag, o etichetta I tag devono essere annidati XML non ha tag predefiniti è estensibile consente di definire nuovi linguaggi è un metalinguaggio Uno degli obiettivi di progettazione di XML: deve essere in un formato leggibile dall uomo è ascii. Costruzione di Interfacce - Paolo Cignoni 9

Xml I documenti xml sono strutturati in tre parti, (le prime due sono opzionali) 2. XML processing instruction: identifica la versione di XML usata e come è codificata e se riferisce altri file: <?xml version="1.0" encoding="ucs2" standalone="yes?> 3. document type declaration (DTD): che o contiene al suo interno una dichiarazione formale di quali tag (e come) il doc usa (internal subset), o riferisce un file che contiene tali dichiarazioni: (external subset), <!DOCTYPE memo SYSTEM "http://www.myco.com//memo.dtd"> 4. Il doc xml vero e proprio il cui elemento radice corrisponde con il tipo specificato nel dtd. Tutti gli altri tag sono nestati in questo. Costruzione di Interfacce - Paolo Cignoni 10

Xml dettagli Sintassi È case sensitive Elemento: ciò che è racchiuso da una coppia <tag> </tag> Un tag può avere attributi <tag att0= str1 att0= str1 > </tag> Valida anche la sintassi <tag attr= asdfasd /> Commenti <!-- questo e un commento. //--> Costruzione di Interfacce - Paolo Cignoni 11

XML Perchè usiamo xml? Perchè aiuta molto nella definizione del formato di file della nostra applicazione No problemi di parsing. Estendibilità innata (è facile fare backward compatibility) Facile gestire set non ordinati Facile gestire assenza di elementi Fa sempre comodo conoscere una tecnologia in più Costruzione di Interfacce - Paolo Cignoni 12

XML e linguaggi oo Ad ogni classe corrisponde un elemento I membri di una classe sono naturalmente annidati. Corrispondenza naturale tra strutture dati e formato xml Costruzione di Interfacce - Paolo Cignoni 13

Esempio <business-card> <persona> <titolo> Sig. </titolo> <nome> Mario </nome> <cognome> Rossi </cognome> </persona> <indirizzo> <strada> Via Verdi </strada> <numero-civico> 12 </numero-civico> <cap> 56100 </cap> <citta> Pisa </citta> </indirizzo> </business-card> class BusinnesCard { public: Persona m_pers; Indirizzo m_ind; }; class Persona {public: string m_titolo; string m_nome; string m_cognome; }; class Indirizzo {public: string m_strada; string m_numero int m_cap; string m_citta; } Costruzione di Interfacce - Paolo Cignoni 14

Xml in pratica Generare xml è assai facile La via del praticone: printf( <tag> %i </tag>,val); Facile ma possibilità di fare errori di sintassi xml Appoggiandosi a QT Costruzione di Interfacce - Paolo Cignoni 15

Modello DOM I parser xml appartengono a due grosse categorie DOM: Document Object Model Leggono tutto un file xml e restituiscono un oggetto c++ (o in qualunque altro linguaggio) che memorizza tutto l albero con tutti gli elementi e gli attributi. L applicazione poi naviga l albero con calma. SAX: Simple Api for Xml Generano eventi durante la lettura che devono essere gestiti dall applicazione Costruzione di Interfacce - Paolo Cignoni 16

Scene Graph Il problema principale è che il mio documento/scena non è affatto strutturato. Scriviamoci il nostro semplicissimo scene graph ad hoc Cosa ci deve stare dentro? Mesh trasformazioni Animazioni Costruzione di Interfacce - Paolo Cignoni 17

CSG La scena la assumo strutturata come un albero Assumo che ogni nodo sia riferito solo una volta. Due classi principali CSG: contiene l intero scene graph (la radice) CSGNode: generico nodo dello scene graph, lo faccio come classe astratta; Costruzione di Interfacce - Paolo Cignoni 18

CSGNode class CSG {public: CSG(void); ~CSG(void); CSGGroup root; }; class CSGNode {public: virtual ~CSGNode(void){}; virtual void gldraw(const float DocTime)=0; }; Notare che La draw prende in ingresso un tempo che verrà usato o meno La draw è una funzione pure virtual, quindi la classe CSGNode non è istanziabile Tutto quello che mi serve lo derivo da CSGNode, specializzando distruttore e gldraw. Costruzione di Interfacce - Paolo Cignoni 19

CSGGroup Nodo principale per rappresentare un gruppo di nodi È quello che definisce lo scope delle trasformazioni di modellazione Si assume che i figli possano cambiare la modelview modificando lo stato per i successivi fratelli L ordine dei figli è significativo È responsabile della disallocazione dei nodi. Costruzione di Interfacce - Paolo Cignoni 20

CSGGroup class CSGGroup :public CSGNode { public: virtual ~CSGGroup(); typedef list<csgnode *>::iterator iterator; list<csgnode *> Sons; virtual void gldraw(const float DocTime); }; CSGGroup::~CSGGroup() //distruttore: disalloca tutti i figli { for(iterator i=sons.begin();i!=sons.end();++i) delete (*i); } void CSGGroup::glDraw(const float DocTime) { glpushmatrix(); for(iterator i=sons.begin();i!=sons.end();++i) (*i)->gldraw(doctime); glpopmatrix(); Costruzione di Interfacce - Paolo Cignoni 21 }

CISGTransformation Classe che incapsula una generica, statica trasformazione (o composizione di varie trasformazioni) class CSGTransformation :public CSGNode { public: }; Matrix44f m; virtual void gldraw(const float DocTime); void CSGTransformation::glDraw(const float DocTime) { glmultmatrix(m); }; Costruzione di Interfacce - Paolo Cignoni 22

CISGAnimRotation Classe che incapsula una rotazione animata, notare che il tempo da visualizzare arriva da fuori. class CSGAnimRotation :public CSGNode { public: }; Point3f axis; float AngularSpeedDPS; //Degree Per Sec; float StartAngleDeg; virtual void gldraw(const float DocTime); void CSGAnimRotation ::gldraw(const float DocTime) { float CurAngleDeg = StartAngleDeg + DocTime*AngularSpeedDPS ; glrotatef(curangledeg, axis[0],axis[1],axis[2]); }; Costruzione di Interfacce - Paolo Cignoni 23

CISGAnimZPrecession Moto di precessione animato sull asse Z class CSGAnimZPrecession :public CSGNode {public: CSGAnimZPrecession(); virtual ~CSGAnimZPrecession(){}; float DeclinationDeg; float AngularSpeedDPS; //Degree Per Sec; float StartAngleDeg; virtual void gldraw(const float DocTime); }; CSGAnimZPrecession::CSGAnimZPrecession() { StartAngleDeg=0;AngularSpeedDPS=10;DeclinationDeg=30;} void CSGAnimZPrecession::glDraw(const float DocTime) { // precessione: una rotazione il cui asse ruota intorno all'asse z float CurAngleRad=ToRad(StartAngleDeg + DocTime*AngularSpeedDPS); glrotated( DeclinationDeg,cos(CurAngleRad),sin(CurAngleRad),0); }; Costruzione di Interfacce - Paolo Cignoni 24

Modifichiamo MoebiusStrip Deriviamo CIMoebius da CISGNode In questo modo diventa un oggetto che può far parte dello scene graph. Adattiamo la funzione draw Aggiungiamo il distruttore virtuale (che non fa nulla) Costruzione di Interfacce - Paolo Cignoni 25

Usiamo lo SceneGraph Nel main.cpp aggiungiamo un membro: CISG Scene; OnNewDocument: aggiungiamo la costruzione dello scene graph Scene.root.Sons.push_back(new CSGAnimZPrecession()); CIMoebius *ms=new CIMoebius (); ms->generate(); Scene.root.Sons.push_back(ms);\ Notare come si crei apposta un oggetto CIMoebius con la new anziché passargli l indirizzo di un oggetto esistente. Questo per evitare che poi il distruttore del gruppo faccia pasticci cercando di disallocare qualcosa non allocato con la new Costruzione di Interfacce - Paolo Cignoni 26

Usiamo lo SceneGraph Nella funzione di disegno della classe aggiungiamo: Scene.root.glDraw(clock()/1000.0f); Si dovrebbe fare la stessa cosa con tutto il resto (omini, pallina ecc) Costruzione di Interfacce - Paolo Cignoni 27

Leggere e scrivere file in QT un file e considerato come un particolare device I/O classe QIODevice (astratta) un mezzo da cui o su cui si puo leggere/scrivere byte La azioni importanti sono open(int mode)/close()/flush() at(offset pos) readblock(char * data, Q_ULONG maxlen)/ writeblock() readline/getch/putch Costruzione di Interfacce - Paolo Cignoni 28

QIODevice bool QIODevice::open ( int mode ) mode e una combinazione di IO_Raw unbuffered file access IO_ReadOnly IO_WriteOnly IO_ReadWrite IO_Append IO_Truncate IO_Translate enables carriage returns and linefeed translation. Costruzione di Interfacce - Paolo Cignoni 29

Specializzazioni QIODevice Qbuffer buffer in memoria di char QSocket e QSocketDevice per l accesso in rete. QFile: quello che ci interessa Come ci si scrive piu ad alto livello? Costruzione di Interfacce - Paolo Cignoni 30

Cose utili: QFile QDir per gestire dir, sempre con lo / utile per manipolare pathnames QDir::setCurrent(QString) settare la dir corrente cui fanno riferimento i path specificati successivamente (se non assoluti) Costruzione di Interfacce - Paolo Cignoni 31

QTextStream classe per leggere/scrivere testo su un QIODevice QTextStream::QTextStream ( QIODevice * iod ) QTextStream::QTextStream ( QString * str, int filemode ) solito stile c++ << butta nello stream >> legge dallo stream flags e variabili per dire come si trasf i numeri flags(int ) con valori tipo bin, oct, dec, fixedpos ecc. precision(int ) Costruzione di Interfacce - Paolo Cignoni 32

Esempio pratico // il costruttore di QFile non apre il file! QFile xfile("pippo.txt"); // cosi come quello di QDir non cambia dir. QDir xdir("tmptxt"); // fa riferimento al path corrente dell app... xdir.mkdir(""); //...che adesso viene cambiato QDir::setCurrent(xdir.path()); // il file viene creato solo ora. xfile.open(io_writeonly); QTextStream xstrm(&xfile); xstrm << "prova"; xfile.close(); Costruzione di Interfacce - Paolo Cignoni 33

Dom model per XML Interfaccia dom per accedere e modificare file xml si costruisce una rappresentazione gerarchica (un albero!) del documento xml in memoria si lavora sulla rappresentazione in memoria leggere ~ attraversare e interpretare l albero in mem con una qualche visita scrivere ~ creare l albero xml in memoria visitando nel giusto ordine le nostre strutture dati e poi invocare un metodo save Costruzione di Interfacce - Paolo Cignoni 34

QDomDocument la classe che rappresenta l intero documento e la radice dell albero xml permette l accesso a tutti gli elementi dell albero e una specializzazione di QDomNode Costruzione di Interfacce - Paolo Cignoni 35

Classe base QDomNode QDomDocument QDomElement QDomAttr metodi accesso,inserzione/rimozione figli che son sempre QDomNode si puo sapere di che tipo e isdocument/ iselement/isattribute Costruzione di Interfacce - Paolo Cignoni 36

QDomAttr Attributo di un elemento name() value() <link href="http://www.trolltech.com" color="red" /> QDomElement e = //... QDomAttr a = e.attributenode( "href" ); // stampa "http://www.trolltech.com" cout << a.value() << endl; // change the node's attribute a.setvalue( "http://doc.trolltech.com" ); QDomAttr a2 = e.attributenode( "href" ); // stampa "http://doc.trolltech.com" cout << a2.value() << endl; Costruzione di Interfacce - Paolo Cignoni 37

QDomElement rappresenta un elemento tagname() che puo essere cambiato zero o piu attributes QString attribute(name, defval) QDomAttr attributenode(name) Costruzione di Interfacce - Paolo Cignoni 38

QDomDocument gli elementi non possono esistere scollegati da un QDomDocument QDomDocument contiene i metodi per fabbricare gli elementi I nodi hanno un owner che il doc che li ha creati tutte le classi QDom sono solo references saranno cancellati quando sono cancellati tutti gli oggetti che le riferiscono e il document che li possiede si possono importare nodi da altri documenti importnode(..) Costruzione di Interfacce - Paolo Cignoni 39

QDomDocument per settare il contenuto di un doc setcontent si puo usare in input Qstring QBytearray QIODevice Per salvare il contenuto di un doc save(qtextstream) in uno stream vale anche per singoli nodi tostring() Costruzione di Interfacce - Paolo Cignoni 40

QDomDocument QDomDocument doc( "mydocument" ); QFile file( "mydocument.xml" ); if (!file.open( IO_ReadOnly ) ) return; if (!doc.setcontent( &file ) ) { file.close(); return; } file.close(); // print out the element names of all elements that are direct children // of the outermost element. QDomElement docelem = doc.documentelement(); // la radice QDomNode n = docelem.firstchild(); while(!n.isnull() ) { QDomElement e = n.toelement(); // try to convert the node to an element. if(!e.isnull() ) { cout << e.tagname() << endl; // the node really is an element. } Costruzione di Interfacce - Paolo Cignoni 41 n = n.nextsibling(); }

QDomDocument doc( "MyML" ); QDomElement root = doc.createelement( "MyML" ); doc.appendchild( root ); QDomElement tag = doc.createelement( "Greeting" ); root.appendchild( tag ); QDomText t = doc.createtextnode( "Hello World" ); tag.appendchild( t ); QString xml = doc.tostring(); Costruzione di Interfacce - Paolo Cignoni 42

In pratica Per salvare uno scene graph in xml? aggiungere un metodo XMLWrite ad ogni nodo void CISGGroup::XMLWrite(FILE *fp) { fprintf(fp,"<csggroup>\n"); iterator i; for(i=sons.begin();i!=sons.end();++i) (*i)->xmlwrite(fp); fprintf(fp,"</csggroup>\n"); } Costruzione di Interfacce - Paolo Cignoni 43