QVariant to QObject * - PullRequest
       5

QVariant to QObject *

11 голосов
/ 08 октября 2010

Я пытаюсь прикрепить указатель к 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
...

Теперь моя проблема, слот itemActivated. Здесь мне нужно извлечь свой Image* из варианта, и я не знаю, как это сделать.

Я пробовал это, но я получаю ошибку:

"qt_metatype_id" не является членом "QMetaTypeId"

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

Есть подсказка?

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

Ответы [ 3 ]

23 голосов
/ 13 октября 2010

Ответ такой:

// From QVariant to QObject *
QObject * obj = qvariant_cast<QObject *>(item->data(Qt::UserRole));
// from QObject* to myClass*
myClass * lmyClass = qobject_cast<myClass *>(obj);
2 голосов
/ 08 октября 2010

Это выглядит как необычное использование QVariant. Я даже не уверен, поддержит ли QVariant удержание QObject или QObject* таким образом. Вместо этого я бы попытался извлечь из QListWidgetItem, чтобы добавить пользовательские данные, что-то вроде этого:

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() );
     }
}

Кроме того, деструктор этого нового класса дает вам возможность логично убедиться, что ваш Image очищен.

0 голосов
/ 08 октября 2010

Вы вставили свой класс Image как QObject *, поэтому выведите его также как QObject *.Затем выполните qobject_cast, и все должно быть хорошо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...