2010-06-08 18 views
7

मैं क्यूटी QGraphicsScene कक्षा का उपयोग कर रहा हूं, QGraphicsRectItem, QGraphicsLineItem, आदि जैसी पूर्व परिभाषित वस्तुओं को जोड़ रहा हूं और मैं दृश्य सामग्री को डिस्क पर क्रमबद्ध करना चाहता हूं। हालांकि, बेस QGraphicsItem वर्ग (जो अन्य आइटम मैं उपयोग करता हूं) से क्रमबद्धता का समर्थन नहीं करता है इसलिए मुझे अपना कोड रोल करने की आवश्यकता है। समस्या यह है कि इन वस्तुओं के इस्तेमाल के सभी एक आधार QGraphicsItem सूचक के माध्यम से है, इसलिए क्रमबद्धता कोड मैं भयानक है:QGraphicsScene सामग्री को क्रमबद्ध करना

QGraphicsScene* scene = new QGraphicsScene; 
scene->addRect(QRectF(0, 0, 100, 100)); 
scene->addLine(QLineF(0, 0, 100, 100)); 
... 
QList<QGraphicsItem*> list = scene->items(); 
foreach (QGraphicsItem* item, items) 
{ 
    if (item->type() == QGraphicsRectItem::Type) 
    { 
    QGraphicsRectItem* rect = qgraphicsitem_cast<QGraphicsRectItem*>(item); 
    // Access QGraphicsRectItem members here 
    } 
    else if (item->type() == QGraphicsLineItem::Type) 
    { 
    QGraphicsLineItem* line = qgraphicsitem_cast<QGraphicsLineItem*>(item); 
    // Access QGraphicsLineItem members here 
    } 
    ... 
} 

यह अच्छा कोड IMHO नहीं है। तो, बजाय मैं इस तरह एक एबीसी वर्ग बना सकते हैं:

class Item 
{ 
public: 
    virtual void serialize(QDataStream& strm, int version) = 0; 
}; 

class Rect : public QGraphicsRectItem, public Item 
{ 
public: 
    void serialize(QDataStream& strm, int version) 
    { 
    // Serialize this object 
    } 
    ... 
}; 

मैं तो रेक्ट वस्तुओं QGraphicsScene::addItem(new Rect(,,,));

का उपयोग कर जोड़ सकते हैं लेकिन यह वास्तव में मुझे मदद नहीं करता है के रूप में निम्नलिखित दुर्घटना होगा:

QList<QGraphicsItem*> list = scene->items(); 
foreach (QGraphicsItem* item, items) 
{ 
    Item* myitem = reinterpret_class<Item*>(item); 
    myitem->serialize(...) // FAIL 
} 

किसी भी तरह से मैं यह काम कर सकता हूं?

+0

'myitem-> serialize()' क्रैश क्यों करता है।मैं इसे नहीं देख रहा हूँ? –

उत्तर

3

मैं दूसरे पोस्टर से सहमत में डालने पर विचार करना चाहते हो सकता है , QGraphicsItem वास्तव में एक दृश्य आइटम के रूप में देखा जा सकता है और इसलिए अपने मॉडल डेटा को अपनी कक्षा में अलग करना शायद बेहतर होगा।

कहा, मैं अपने दुर्घटना एक अनुचित कलाकारों के कारण होता है लगता है।

आप निम्नलिखित करते हैं:

Rect *r = new Rect(); 
QGraphicsItem *qi = reinterpret_cast<QGraphicsItem*>(r); 
QGraphicsRectItem *qr = reinterpret_cast<QGraphicsRectItem*>(r); 
Item *i = reinterpret_cast<Item*>(r); 
qDebug("r = %p, qi = %p, qr = %p, i = %p", r, qi, qr, i); 

आप यह देखना चाहिए कि आर == क्यूई, आर == qr, लेकिन आर = मैं!। यदि आप इस बारे में सोचते हैं कि विरासत में गुणा करने वाली वस्तु को स्मृति में दर्शाया गया है, तो पहली बेस क्लास स्मृति में पहली बार है, दूसरी बेस क्लास दूसरी है, और आगे। तो दूसरी बेस क्लास के पॉइंटर को पहले बेस क्लास के लगभग [लगभग] आकार से ऑफसेट किया जाएगा।

QList<QGraphicsItem*> list = scene->items(); 
foreach (QGraphicsItem* item, items) 
{ 
    Rect* myrect = reinterpret_class<Rect*>(item); // needed to figure out the offset to the Item part 
    Item* myitem = reinterpret_class<Item*>(myrect); 
    myitem->serialize(...); 
} 

यह कई कारणों में से एक है, मैं एकाधिक वंशानुक्रम से बचने के लिए जब भी संभव तरह:

तो अपने कोड को ठीक करने, मैं आप की तरह कुछ करने के लिए की जरूरत है। जैसा कि पहले सुझाया गया था, मैं दृढ़ता से आपको मॉडल डेटा को अलग करने की सलाह देता हूं।

1

Serializing QGraphicsItem एक अच्छा विचार नहीं है। एक QGrahpicsScene आपके डेटा का प्रतिनिधित्व करना चाहिए। प्रतिनिधित्व को क्रमबद्ध करने के बजाय, आपके आवेदन के डेटा/मॉडल को क्रमबद्ध करना बेहतर है।

यदि आप ग्राफिक्स इकाइयों की व्यवस्था रिकॉर्ड करना चाहते हैं, तो आप कस्टम QGraphicsItem का उपयोग कर सकते हैं और QPicture में आ सकते हैं।

+0

आइटम में सब कुछ शामिल है जो मुझे क्रमबद्ध करने की आवश्यकता है, इसलिए इस मामले में डेटा/मॉडल माना जा सकता है। – Rob

+0

बीटीडब्ल्यू एक QGraphicsScene को एक अलग मॉडल से जोड़ने के लिए समर्थन प्रतीत नहीं होता है। – Rob

0

तुम सच में इन मदों को क्रमानुसार चाहते हैं

QDataStream &operator<<(QDataStream &, const AppropriateSubclass&); 
QDataStream &operator>>(QDataStream &, AppropriateSubclass&); 
QGraphicsItem उपवर्गों है कि आप को क्रमानुसार चाहते हैं से प्रत्येक के लिए

बनाने के लिए, इन कार्यों गैर सदस्य समारोह कर रहे हैं। दृष्टिकोण भी QDataStream प्रलेखन

लेकिन मैं समर्थन स्टीफंस जवाब में बताया गया है, तो आप दृश्य से बाहर वास्तविक डेटा खींच रहा है और एक अलग मॉडल वर्ग

+0

यह तब तक काम नहीं करता जब तक कि मैं इसे स्ट्रीम करने का प्रयास करने से पहले प्रत्येक QGraphicsItems को सही प्रकार पर नहीं डालता। – Rob

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