2010-10-08 2 views
10

Я пытаюсь прикрепить указатель к QListWidgetItem, который будет использоваться в слоте itemActivated.QVariant to QObject *

указатель Я пытаюсь прикрепить это 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’ is not a member of ‘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 *>(); 
+0

Из 'QVariant (INT TypeID, сопзЬ пустота * копия)' т е р документация: «Как правило, вы никогда не должны использовать этот конструктор, используйте [QVariant :: fromValue()] (http://doc.qt.io/qt-5/qvariant.html#fromValue) вместо этого, чтобы построить варианты из типов указателей, представленных QMetaType :: VoidStar, и QMetaType :: QObjectStar «. –

+0

Также обратите внимание, что тип '& im' является' Image ** ', а не' Image * '. –

ответ

20

Ответ этот

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

Нет, вы написали, что делать, но мне нужно КАК ДЕЛАТЬ ЭТО. –

+0

Почему вы не используете 'qvariant_cast' для прямого перевода на' myClass * '? Вот так: 'myClass * lmyClass = qvariant_cast (item-data (Qt :: UserRole));'? – Ignitor

+0

Nevermind: Посмотрев на реализацию 'qvariant_cast', я сказал, почему: параметр типа для qvariant_cast должен (должен?) Быть известен системе метаобъектов. – Ignitor

2

Это похоже на необычное использование 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()); 
    } 
} 

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

+0

Спасибо за ашполятор за это приятное и чистое решение. –

+0

Извините aschepler, это не сработает. СИГНАЛЫ не испускаются, как я могу решить эту проблему? –

0

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

Смежные вопросы