Strumenti Utente



memorizzare_un_puntatore_in_una_classe_qvariant

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 "Model/View" delle librerie 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<void *>();

Possiamo semplificare quest'operazione ricorrendo ad un template contenente due metodi di tipo statico

template <class T> class VariantPtr
{
public:
    static T* asPtr(QVariant v)
    {
	return  (T *) v.value<void *>();
    }
    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<MyClass>::asQVariant(p);

Per recuperarlo invece usiamo il codice

MyClass *p1 = VPtr<MyClass>::asPtr(v);

Comments


memorizzare_un_puntatore_in_una_classe_qvariant.txt · Ultima modifica: 2013/04/11 13:00 da mickele77

Facebook Twitter Google+ Digg Reddit LinkedIn StumbleUpon Email