2011-09-15 8 views
8

से सभी QGraphicsItem को कैसे हटाएं मैंने QGraphicsScene से व्युत्पन्न कक्षा लिखी है। एक बिंदु पर मुझे दृश्य से सभी वस्तुओं को हटाने की जरूरत है और मैं चाहता हूं कि आइटम शारीरिक रूप से नष्ट हो जाएं (विनाशक कहा जाता है)। मैंने कोशिश की है: चेतावनी: C4150:QGraphicsScene

QList<QGraphicsItem*> all = items(); 
for (int i = 0; i < all.size(); i++) 
{ 
    QGraphicsItem *gi = all[i]; 
    removeItem(gi); 
    delete gi; // warning at this line 
} 

क्यूटी निर्माता एक चेतावनी का उत्सर्जन करता है अधूरा प्रकार 'QGraphicsItem' के लिए सूचक का विलोपन;

नामक कोई विनाशक नहीं है मुझे यकीन नहीं है कि वह क्यों है। QGraphicsItem में वर्चुअल विनाशक है इसलिए आइटम को स्मृति से हटा दिया जाना चाहिए।

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

उत्तर

7

आप उस फ़ाइल में

#include <QGraphicsItem> 

किया है। अन्यथा, संकलक क्या QGraphicsItem है नहीं है, यह एक आभासी नाशक है, आदि

9

तरह jpalecek ने कहा, आप हेडर फाइल लापता हैं। आपको उसका जवाब स्वीकार करना चाहिए। मैं बस दो संभावित मुद्दों को इंगित करने जा रहा हूं:

सबसे पहले, आपको QGraphicsScene::removeItem() पर कॉल करने की आवश्यकता नहीं है। QGraphicsItem::~QGraphicsItem() आपके लिए यह करता है।

दूसरा। सावधान रहें यदि आप दूसरों के अंदर QGraphicsItem डालते हैं। यही है, आपके पास ऐसी चीजें हैं जो अन्य वस्तुओं के बच्चे हैं। QGraphicsItem का विनाशक अपने सभी बच्चों को स्वचालित रूप से हटा देता है। तो जब आप QGraphicsScene से लौटे गए आइटमों के माध्यम से लूप करते हैं, तो आप अपने बच्चे द्वारा पहले से हटाए गए बच्चे आइटम को हटा सकते हैं। उदाहरण के लिए, कहें कि आपके पास 2 आइटम हैं, ए और बी, और बी ए का बच्चा है जब आप ए को हटाते हैं, बी स्वचालित रूप से हटा दिया जाता है। और फिर आप बी प्राप्त करते हैं और इसे हटाने का प्रयास करते हैं। बूम!

यह करने के लिए अधिक सुरक्षित तरीका यदि आइटम शीर्ष स्तर से एक है परीक्षण करने के लिए है, यानी यह कोई माता-पिता होते हैं:

QList<QGraphicsItem*> all = items(); 
for (int i = 0; i < all.size(); i++) 
{ 
    QGraphicsItem *gi = all[i]; 
    if(gi->parentItem()==NULL) { 
     delete gi; 
    } 
} 
संबंधित मुद्दे