2012-10-22 8 views
8

मेरी परियोजना में मैं QGraphicsScene का उपयोग कर रहा हूं और कोड भर में आइटम जोड़ रहा/निकाल रहा हूं।AddItem या itemChange पर QGraphicsScene से अधिसूचनाएं कैसे प्राप्त करें?

अब जब भी QGraphicsItem जोड़ा या हटा दिया जाता है तो मैं अधिसूचित होना चाहता हूं। कई क्यूटी कक्षाओं में अधिसूचना सिग्नल या कम से कम आभासी कार्य होते हैं जिन्हें ऐसे परिवर्तनों पर बुलाया जाता है। मैं कई जगहों पर कोड की कई पंक्तियों को जोड़ने से बचने की कोशिश कर रहा हूं जो न केवल बोझिल है बल्कि असुरक्षित है (अब या भविष्य में एक डालने/हटाने को भूलना)।

मुझे किसी समाधान की आवश्यकता है जो QGraphicsItem के साथ काम करता है। > कोई नहीं है -

  • (QAbstractItemModel::rowsInserted() के रूप में) QGraphicsSceneके सिग्नल से कनेक्ट:

    यह चीजें हैं जो काम नहीं करते की एक सूची है।

  • QGraphicsScene से प्राप्त होता है और वर्चुअल नोटिफ़ायर फ़ंक्शन (जैसे QTabWidget::tabInserted()) -> कोई भी नहीं है।
  • इनहेरिट और अधिभार addItem(), भेजने सूचनाएं अपने आप (QMdiArea::addSubWindow() के रूप में) ->addItem आभासी नहीं है और QGraphicsItems के निर्माताओं से कहा जाता हो जाता है।
  • नए जोड़े गए QGraphicsItems पर ईवेंट फ़िल्टर इंस्टॉल करें -> यह नहीं पता कि नया जोड़ा गया आइटम कैसे प्राप्त करें और यह sceneEventFilter होगा जो केवल QGraphicsItems पर स्थापित किया जा सकता है।
  • QGraphicsItem से कनेक्ट करें ->itemChange सिग्नल नहीं है और ओवरलोडिंग QGraphicsItem एक विकल्प नहीं है।
  • रैप QGraphicsScene (एक निजी सदस्य के रूप में दृश्य वाले) और केवल कार्यों का पर्दाफाश addItem और removeItem -> लेकिन उस दृश्य अभी भी scene() समारोह के माध्यम से उस तक पहुँच सकता है में QGraphicsItems, तो यह समाधान पर्याप्त सुरक्षित नहीं है।

आइटम परिवर्तनों पर मुझे सूचनाएं कैसे प्राप्त हो सकती हैं?

यदि कोई आसान तरीका है जिसे मैं बस याद करता हूं, तो कृपया मुझे इंगित करें। अन्यथा, मैं इस पर विचारों की सराहना करता हूं।

+0

मुझे लगता है कि सबसे अच्छा तरीका केवल QGraphicsScene को लपेटना है और रैपर में अपना 'addItem()' फ़ंक्शन प्रदान करना है। – pmr

+0

यह शर्म की बात है कि आप 'QGraphicsItem' को उपclass नहीं कर सकते हैं क्योंकि इसके दृश्य दृश्य (दृश्य जोड़/निकालने सहित) इसके' sceneEvent (QEvent * ईवेंट) 'विधि के माध्यम से चलाया जाता है - जो आपकी समस्या के लिए एक बहुत ही साफ और ट्यून करने योग्य समाधान प्रदान करता है। – cmannett85

+0

@pmr जैसा कि मैंने कहा था, 'addItem() 'फ़ंक्शन आभासी नहीं है और' QGraphicsItem 'के रचनाकारों से बुलाया जाता है। तो यह एक पूरा समाधान नहीं होगा। –

उत्तर

0

मुझे लगता है कि आप सबसे अच्छा कर सकते हैं QGraphicsScene::changed() सिग्नल से कनेक्ट करना है।

यह आपको यह नहीं बताएगा कि आइटम को QGraphicsView के लिए डिस्प्ले अपडेट करने के लिए क्या बदल दिया गया है/जोड़ा/हटा दिया गया है। लेकिन आप आपूर्ति क्षेत्रों का उपयोग करने में सक्षम होना चाहिए।

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