Bonjour ,
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 :
- Node* node = static_cast<Node*>(indexes[0].internalPointer()); // on récupère le Node* depuis l'item selectionnée
- byteArray.setNum((int)node); // the grouikkk cast
|
unmarshalling :
Code :
- bool ok = false;
- int node_ptr = byteArray.toInt(&ok);
- 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.