~~NEWSFEED~~ ====== Memorizzare un puntatore in una classe QVariant ====== Alla pagina [[http://blog.bigpixel.ro/2010/04/storing-pointer-in-qvariant/]] ho trovato un metodo molto utile per memorizzare puntatori di qualunque tipo in un oggetto di tipo QVariant. Per chi non fosse pratico della programmazione [[http://qt-project.org/doc/qt-5.0/qtwidgets/model-view-programming.html|"Model/View"]] delle librerie [[http://qt-project.org/|Qt]], diciamo che separando il modello dei nostri dati dalla relativa interfaccia grafica, il passaggio delle informazioni tra i due avviene attraverso oggetti di tipo QVariant, contenitori generici che possono contenere praticamente di tutto. I metodi della classe QVariant ci pemettono di gestire facilmente oggetto di tipo double, int, QString. Meno immediato รจ il passaggio di puntatori a classi personalizzate che adesso analizzeremo. Vediamo i dettagli su come procedere. Supponiamo di avere un puntatore MyClass * pointer Possiamo memorizzare il contenuto del puntatore in un oggetto QVariant mediante QVariant v = qVariantFromValue((void *) pointer ); Volendo recuperare il puntatore dall'oggetto QVariant ricorriamo alle righe di codice pointer = (MyClass *) v.value(); Possiamo semplificare quest'operazione ricorrendo ad un template contenente due metodi di tipo statico ~~READMORE~~ template class VariantPtr { public: static T* asPtr(QVariant v) { return (T *) v.value(); } static QVariant asQVariant(T* ptr) { return qVariantFromValue((void *) ptr); } }; E' possibile ora riscrivere le linee di codice viste sopra per memorizzazione e recuperare il puntatore dall'oggetto Qvariant. Per copiare il valore del puntatore ricorriamo a QVariant v = VPtr::asQVariant(p); Per recuperarlo invece usiamo il codice MyClass *p1 = VPtr::asPtr(v);