C++ QObject的QVariant*

C++ QObject的QVariant*,c++,qt4,C++,Qt4,我正在尝试附加一个指向QListWidgetItem的指针,以便在插槽itemActivated中使用 我试图附加的指针是QObject*子体,因此,我的代码如下所示: Image * im = new Image(); // here I add data to my Image object // now I create my item QListWidgetItem * lst1 = new QListWidgetItem(*icon, serie->getSeriesInst

我正在尝试附加一个指向
QListWidgetItem
的指针,以便在插槽
itemActivated
中使用

我试图附加的指针是
QObject*
子体,因此,我的代码如下所示:

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
...
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() );
     }
}
现在我的问题是,
itemActivated
插槽。这里我需要从变量中提取我的
图像*
,我不知道如何提取

我尝试了这个,但我得到了错误:

“qt_元类型_id”不是“QMetaTypeId”的成员

void MainWindow::itemActivated(QListWidgetItem*item)
{
Image*im=item->data(Qt::UserRole).value();
qDebug(im->getImage().toAscii());
}
有什么提示吗

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

这看起来像是
QVariant
的一个不寻常的用法。我甚至不确定
QVariant
是否支持以这种方式持有
QObject
QObject*
。相反,我会尝试从
QListWidgetItem
派生以添加自定义数据,如下所示:

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
...
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() );
     }
}
class ImageListItem:公共QListWidgetItem
{
//(不是Q_对象)
公众:
ImageListItem(常量图标、常量字符串和文本、,
图像*图像,
QListWidget*parent=0,int type=type);
virtual~ImageListItem();
虚拟QListWidgetItem*clone();//虚拟副本构造函数
Image*getImage()常量;
私人:
图像*\u图像;
};
void MainWindow::itemActivated(QListWidgetItem*item)
{
ImageListItem*图像项=动态项(项);
如果(!图像_项)
{
qDebug(“非图像项”);
}
其他的
{
Image*im=Image_item->getImage();
qDebug(im->getImage().toAscii());
}
}

另外,这个新类的析构函数为您提供了一个合乎逻辑的地方,以确保您的
图像得到清理。

您已将图像类作为QObject*插入,因此也将其作为QObject*导出。然后执行qobject_cast,一切都会很好

答案是

// From QVariant to QObject *
QObject * obj = qvariant_cast<QObject *>(item->data(Qt::UserRole));
// from QObject* to myClass*
myClass * lmyClass = qobject_cast<myClass *>(obj);
//从QVariant到QObject*
QObject*obj=qvariant_cast(项->数据(Qt::UserRole));
//从QObject*到myClass*
myClass*lmyClass=QoObject_cast(obj);

感谢aschepler提供了这个漂亮干净的解决方案。对不起,aschepler,这行不通。信号没有发出,我如何解决这个问题?不,你写了怎么做,但我需要怎么做。你为什么不使用
qvariant\u cast
直接转换到
myClass*
?如下所示:
myClass*lmyClass=qvariant_cast(条目数据(Qt::UserRole))?Nevermind:查看
qvariant_cast
的实现,告诉我为什么:元对象系统必须(应该?)知道qvariant_cast的类型参数。从
qvariant(int-typeId,const-void*copy)
ctor文档:“通常,您不必使用此构造函数,而是使用它来构造由QMetaType::VoidStar和QMetaType::QObjectStar表示的指针类型的变体。”还要注意,
&im
的类型是
Image**
,而不是
Image*