Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2952 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] caster un pointeur en int ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] caster un pointeur en int ?

n°1427111
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 18-08-2006 à 12:11:24  profilanswer
 

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.
mood
Publicité
Posté le 18-08-2006 à 12:11:24  profilanswer
 

n°1427392
Taz
bisounours-codeur
Posté le 18-08-2006 à 17:15:53  profilanswer
 

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 ?

n°1427397
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 18-08-2006 à 17:21:22  profilanswer
 

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.
n°1428372
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 21-08-2006 à 09:16:04  profilanswer
 

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.
n°1432039
nargy
Posté le 27-08-2006 à 10:04:15  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] caster un pointeur en int ?

 

Sujets relatifs
problème avec une fonction qui renvoie un pointeur de charcaster en char * une structure
InCoMpReHeNsIbLe (pointeur non portable !?!*#...)Renvoyer un pointeur pour du C.
Differentes facons de passer un pointeur.....Je souhaiterai faire des liens souligné au contact du pointeur
Tableau de pointeur en c++Pointeur et tableau
un tit souci de pointeur(builder) Pointeur sur un objet
Plus de sujets relatifs à : [C++] caster un pointeur en int ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR