2010-10-08 26 views
10

Tôi đang cố đính kèm một con trỏ vào một số QListWidgetItem, được sử dụng trong vùng itemActivated.QVariant to QObject *

Con trỏ Tôi đang cố gắng để đính kèm là một hậu duệ QObject*, vì vậy, mã của tôi là một cái gì đó như thế này:

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 
... 

Bây giờ vấn đề của tôi, khe itemActivated. Ở đây tôi cần trích xuất số Image* từ biến thể, và tôi không biết làm thế nào.

tôi đã cố gắng này, nhưng tôi nhận được lỗi:

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

Bất kỳ gợi ý?

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

Từ 'QVariant (int typeid, const void * bản sao) 'ctor tài liệu: "Thông thường, bạn không bao giờ phải sử dụng constructor này, sử dụng [QVariant :: fromValue()] (http://doc.qt.io/qt-5/qvariant.html#fromValue) để thay thế các biến thể từ các kiểu con trỏ được biểu diễn bằng QMetaType :: VoidStar và QMetaType :: QObjectStar . " –

+0

Cũng lưu ý rằng loại '& im' là' Hình ảnh ** ', không phải' Hình ảnh * '. –

Trả lời

20

Câu trả lời là đây

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

Không, bạn đã viết phải làm gì, nhưng tôi cần LÀM THẾ NÀO ĐỂ LÀM VIỆC. –

+0

Tại sao bạn không sử dụng 'qvariant_cast' để trực tiếp truyền tới' myClass * '? Như thế này: 'myClass * lmyClass = qvariant_cast (mục-dữ liệu (Qt :: UserRole));'? – Ignitor

+0

Nevermind: Nhìn vào việc thực hiện 'qvariant_cast' đã nói với tôi tại sao: tham số kiểu cho qvariant_cast phải (nên?) Được biết đến với hệ thống meta-object. – Ignitor

2

Có vẻ như việc sử dụng bất thường là QVariant. Tôi thậm chí không chắc chắn nếu QVariant sẽ hỗ trợ giữ QObject hoặc QObject* theo cách đó. Thay vào đó, tôi sẽ cố gắng phát sinh từ QListWidgetItem để thêm dữ liệu tùy chỉnh, một cái gì đó như thế này:

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, destructor của lớp mới này mang đến cho bạn một nơi hợp lý để đảm bảo Image của bạn được dọn dẹp.

+0

Cảm ơn người quản lý về giải pháp tốt đẹp và sạch sẽ này. –

+0

Xin lỗi người quản lý, điều này sẽ không hoạt động. Các SIGNAL không được phát ra, làm thế nào tôi có thể giải quyết vấn đề này? –

0

Bạn đã chèn lớp Hình ảnh của mình dưới dạng QObject *, vì vậy hãy lấy nó ra dưới dạng QObject *. Sau đó thực hiện qobject_cast và tất cả mọi thứ nên được tốt

Các vấn đề liên quan