2010-10-08 13 views
10

Estoy tratando de conectar un puntero a un QListWidgetItem, para ser utilizado en la ranura itemActivated.QVariant to QObject *

El puntero Estoy intentando conectar es un descendiente QObject*, así, mi código es algo como esto:

Image * im = new Image(); 
// here I add data to my Image object 
// now I create my item 
QListWidgetItem * lst1 = new QListWidgetItem(*icon, serie->getSeriesInstanceUID(), m_iconView); 
// then I set my instance to a QVariant 
QVariant v(QMetaType::QObjectStar, &im) 
// now I "attach" the variant to the item. 
lst1->setData(Qt::UserRole, v); 
//After this, I connect the SIGNAL and SLOT 
... 

Ahora mi problema, la ranura itemActivated. Aquí necesito extraer mi Image* de la variante, y no sé cómo hacerlo.

yo probamos este, pero me sale el error:

‘qt_metatype_id’ is not a member of ‘QMetaTypeId’

void MainWindow::itemActivated(QListWidgetItem * item) 
{ 
    Image * im = item->data(Qt::UserRole).value<Image *>(); 
    qDebug(im->getImage().toAscii()); 
} 

Cualquier pista?

Image * im = item->data(Qt::UserRole).value<Image *>(); 
+0

Desde el 'QVariant (int TypeId, const void * copia)' documentación Héctor: "Por lo general, nunca se tiene que utilizar este constructor, utilice [QVariant :: fromValue()] (http://doc.qt.io/qt-5/qvariant.html#fromValue) para construir variantes de los tipos de puntero representados por QMetaType :: VoidStar y QMetaType :: QObjectStar " –

+0

También tenga en cuenta que el tipo de '& im' es' Imagen ** ', no' Imagen * '. –

Respuesta

20

La respuesta es la siguiente

// From QVariant to QObject * 
QObject * obj = qvariant_cast<QObject *>(item->data(Qt::UserRole)); 
// from QObject* to myClass* 
myClass * lmyClass = qobject_cast<myClass *>(obj); 
+5

No, usted escribió qué hacer, pero yo necesitaba CÓMO HACERLO. –

+0

¿Por qué no usas 'qvariant_cast' para lanzar directamente a' myClass * '? De esta manera: 'myClass * lmyClass = qvariant_cast (item-data (Qt :: UserRole));'? – Ignitor

+0

No importa: al ver la implementación de 'qvariant_cast', me explico por qué: el sistema de metaobjetos conoce el parámetro tipo para qvariant_cast (¿debería?). – Ignitor

2

Parece un uso inusual de QVariant. Ni siquiera estoy seguro de si QVariant sería compatible con la celebración de un QObject o QObject* de esa manera. En su lugar, me gustaría probar que deriva de QListWidgetItem con el fin de añadir datos personalizados, algo como esto:

class ImageListItem : public QListWidgetItem 
{ 
    // (Not a Q_OBJECT) 
public: 
    ImageListItem(const QIcon & icon, const QString & text, 
       Image * image, 
       QListWidget * parent = 0, int type = Type); 
    virtual ~ImageListItem(); 
    virtual QListWidgetItem* clone(); // virtual copy constructor 
    Image * getImage() const; 

private: 
    Image * _image; 
}; 

void MainWindow::itemActivated(QListWidgetItem * item) 
{ 
    ImageListItem *image_item = dynamic_cast<ImageListItem*>(item); 
    if (!image_item) 
    { 
      qDebug("Not an image item"); 
    } 
    else 
    { 
     Image * im = image_item->getImage(); 
     qDebug(im->getImage().toAscii()); 
    } 
} 

Además, el destructor de esta nueva clase le da un lugar lógico para asegurarse de que su Image se limpie.

+0

Gracias aschepler por esta solución agradable y limpia. –

+0

Lo siento aschepler, esto no funcionará. Las SEÑALES no se emiten, ¿cómo puedo solucionar este problema? –

0

Has insertado tu clase de imagen como QObject *, por lo tanto, obténla también como QObject *. A continuación, realice qobject_cast y todo debería estar bien

Cuestiones relacionadas