2010-10-08 10 views
10

को मैं एक QListWidgetItem के लिए सूचक संलग्न करने के लिए कोशिश कर रहा हूँ स्लॉट itemActivated में इस्तेमाल किया जाएगा।QVariant 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 :: fromValue()] (http://doc.qt.io/qt-5/qvariant.html#fromValue) के बजाय सूचक प्रकार QMetaType :: VoidStar द्वारा प्रतिनिधित्व से वेरिएंट के निर्माण के लिए, और QMetaType :: QObjectStar । " –

+0

यह भी ध्यान दें कि '& im' का प्रकार' छवि ** 'है, न कि 'छवि *'। –

उत्तर

20

जवाब इस

// From QVariant to QObject * 
QObject * obj = qvariant_cast<QObject *>(item->data(Qt::UserRole)); 
// from QObject* to myClass* 
myClass * lmyClass = qobject_cast<myClass *>(obj); 
`QVariant (पूर्णांक typeId, स्थिरांक शून्य * प्रतिलिपि)` ctor प्रलेखन से
+5

नहीं, आपने लिखा है कि क्या करना है, लेकिन मुझे इसकी आवश्यकता है। –

+0

क्यों आप सीधे 'myClass को कास्ट करने के लिए' qvariant_cast' का उपयोग नहीं करते * '? इस तरह: 'myClass * lmyClass = qvariant_cast (मद-डेटा (क्यूटी :: UserRole));'? – Ignitor

+0

कभी नहीं: '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()); 
    } 
} 

साथ ही, इस नए वर्ग के नाशक आप कहीं तार्किक सुनिश्चित करें कि आपके Image साफ हो जाता है बनाने के लिए देता है।

+0

इस अच्छे और साफ समाधान के लिए धन्यवाद एस्केप्लर। –

+0

क्षमा करें aschepler, यह काम नहीं करेगा। सिग्नल उत्सर्जित नहीं होते हैं, मैं इस समस्या को कैसे हल कर सकता हूं? –

0

आप के रूप QObject * अपने छवि वर्ग डाला, तो QObject के रूप में यह बाहर निकलना * भी गए हैं। तब qobject_cast करते हैं और सब कुछ ठीक हो जाना चाहिए

संबंधित मुद्दे