[C++] caster un pointeur en int ?

caster un pointeur en int ? [C++] - C++ - Programmation

Marsh Posté le 18-08-2006 à 12:11:24    

Bonjour  :hello: ,
je vais vous expliquer pourquoi je vais faire quelque chose de sale, vous me direz ensuite si on peut faire un peu moins sale. :/
 
Je suis en train de faire un Model pour une QTreeView en QT, et j'aimerai pouvoir drag&dropper des items d'un endroit du QTreeView vers un autre endroit du QTreeView.
 
En QT le mécanisme de copy/paste et de drag&drop passe par des QMimeData. L'idée est qu'un item d'une widget quelconque est "marshallé" (sérializé ?) en QMimeData (objet qui comporte un champ "text/plain", "application/structure" ou autre mime type, et un QByteArray)
Ainsi à l'arrivée (au drop/paste) il est unmarshallé et on extrait les informations souhaitées.
Ca permet par exemple de copier/coller d'un Tree vers une TextArea : la ligne de l'arbre est marshallée en string, et à l'arrivée on lit la string)
 
Là je dois drag&drop une branche en interne du TreeView au TreeView. Et ma structure de données sous jacente (un arbre) n'a pas encore de méthode pour serialiser un sous-arbre.
 
Ce que j'ai envie de faire, c'est de mettre dans le QMimeData le pointeur sur le noeud de ma structure (le noeud qui est déplacé), comme ca à l'arrivée j'ai mon noeud à déplacer, et l'endroit où le mettre.
 
Problèmes :  
1 - je suis en train de crée un Model pour TreeView dont les méthodes liées au MimeData auront un comportement dangereux si un jour ce truc est réutilisé et qu'on veut faire des opérations de ce widget vers un autre widget (bon ok c'est que pour moi, à titre privé, mais c'est le principe qui me gêne)  
2 - ca ressemble en gros à ça (éloignez les enfants) :
 
marshalling :

Code :
  1. Node* node = static_cast<Node*>(indexes[0].internalPointer()); // on récupère le Node* depuis l'item selectionnée
  2. byteArray.setNum((int)node); // the grouikkk cast


 
unmarshalling :

Code :
  1. bool ok = false;
  2. int node_ptr = byteArray.toInt(&ok);
  3. if (ok) { Node* node = (Node*)node_ptr; }


 
Cast C-style, supposition que taille d'un pointeur = taille d'un entier, bref c'est sale...  :(  
 
Peut-on faire un peu moins sale en restant dans l'idée "stockons un pointeur" ?  :??:  
 
PB : http://doc.trolltech.com/4.1/qmimedata.html


Message édité par Xavier_OM le 18-08-2006 à 12:13:24

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 18-08-2006 à 12:11:24   

Reply

Marsh Posté le 18-08-2006 à 17:15:53    

ne le fais surtout pas, ce n'est absolument par portable et ça explosera sur du 64bits.
 
Et c'est quoi ce static_cast au dessus ?

Reply

Marsh Posté le 18-08-2006 à 17:21:22    

Taz a écrit :

ne le fais surtout pas, ce n'est absolument par portable et ça explosera sur du 64bits.
 
Et c'est quoi ce static_cast au dessus ?


 
C'est bien ce qui me semblait :(
 
Le static_cast est la méthode conseillée par la doc de QT pour récupérer les objets planqués derrère les "QModelIndex" (les items graphiques en quelque  sorte).  
Si on crée un QModelIndex à partir d'un toto, ce QModelIndex garde une sorte de handler sur ce toto, et on peut le récupèrer en faisant un static_cast sur index.internalPointer().
 
 
PS : à ton avis, y a-t-il là dedans une solution pour stocker un pointeur ? http://doc.trolltech.com/4.1/qbytearray.html


Message édité par Xavier_OM le 18-08-2006 à 17:31:58

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 21-08-2006 à 09:16:04    

Bon ben temporairement je vais stocker l'item à drag&dropper dans une variable privée statique, ca sera "moins pire"  [:spamafote]


Message édité par Xavier_OM le 21-08-2006 à 09:16:14

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 27-08-2006 à 10:04:15    

Et si... tu numérotait plutot quutiliser un pointeur.
Dans une QPtrList (ou autre) tu stocke les pointeurs vers noeuds de ton arbre.
Chaque noeud possède alors un numéro d'ordre dans la liste.
Tu fait référence à ce numéro d'ordre plutot qu'à un pointeur.
 
Note que ça peut tout de même avoir des conséquences si l'utilisateur vient à drag&dropper un noeud d'une application à une autre.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed