2013-01-31 35 views
5

के साथ पूर्ववत रूपरेखा को एकीकृत रूप से एकीकृत करना मैं एक क्यूटी ऐप लिख रहा हूं जो QGraphicsScene कैनवास के आसपास चलने योग्य आकार के साथ आधारित है, और मैं पूर्ववत-पूर्व कार्यक्षमता को एकीकृत करने की कोशिश कर रहा हूं। आकारों के निर्माण और हटाने जैसे अधिकांश कार्यों के लिए QGraphicsScene पर लागू करने के लिए यह काफी छोटा है, लेकिन मैं तत्वों को चलाना चाहता हूं और आंदोलन को पूर्ववत करने के लिए चाहता हूं। अभी मैं दृश्य पर रबड़ बैंड ड्रैगमोड और ItemIsSelectable और ItemIsMovable वस्तुओं पर झंडे का उपयोग कर रहा हूं। समस्या यह है कि आकार आंदोलन का प्रतिनिधित्व करने के लिए QUndoCommand बनाने के लिए कोई अच्छी जगह नहीं है। यदि मैं इसे QGraphicsScene::itemChange विधि में करता हूं, तो दो या दो से अधिक आकारों को चुनने और स्थानांतरित करने के लिए अलग-अलग ऑब्जेक्ट्स अलग-अलग ऑब्जेक्ट्स में अलग-अलग ऑब्जेक्ट्स के लिए परिणाम दिया जाता है और इस प्रकार विलय करने में सक्षम नहीं होते हैं, इसलिए अप्रत्याशित व्यवहार में परिणाम पूर्ववत करते हैं। QGraphicsScene में कोई घटना नहीं है जिसे कॉल किया जा सकता है जब उसके आइटम चारों ओर स्थानांतरित हो जाते हैं, इसलिए मैं फंस गया हूं।क्यूटी: QGraphicsScene

सबसे खराब स्थिति यह है कि मुझे लगता है कि मैं अपने कस्टम QGraphicsItem वस्तुओं पर ItemIsMovable ध्वज को अक्षम और QGraphicsScene माउस घटनाओं में पूरी तरह से आंदोलन को संभालने, लेकिन है कि कार्यक्षमता reimplementing ठीक से काफी जटिल लगता है (मैं जाँच कैसे क्यूटी वह आंतरिक रूप से करता है और जटिल मामलों को संभालने के लिए बहुत सारे कोड हैं, जैसे कि एक वस्तु और उसके कुछ बच्चे दोनों चुने गए हैं)। यह पूर्ववत स्टैक के लिए उपयोग के सबसे स्पष्ट मामलों की तरह लगता है (इतना है कि पूर्ववत ढांचे के लिए उदाहरण प्रोग्राम QGraphicsScene प्रोग्राम जैसा है, मेरे जैसे बहुत अधिक ऑब्जेक्ट आंदोलन समर्थन के बिना) तो यह अजीब लगता है कि इसमें कोई अंतर्निहित नहीं है कोर कार्यक्षमता के एक महत्वपूर्ण हिस्से को पुन: कार्यान्वित किए बिना इसे करने का तरीका। क्या किसी के पास प्रोग्राम की कोई अंतर्दृष्टि या उदाहरण हैं जो ऐसा करते हैं?

उत्तर

4

मैंने इसे कुछ हद तक हलचल से हल किया। मैं अपने कस्टम आकार के लिए और QGraphicsScene की mousePressedEvent में एक preMovePoint संपत्ति कहा, मैं उनके संबंधित वर्तमान पदों के लिए चयनित आकारों में से प्रत्येक के preMovePoint निर्धारित करते हैं, और mouseReleaseEvent में, की वर्तमान pos को preMovePoint से एक समग्र कदम आदेश बनाया प्रत्येक आकार। मुझे अभी भी यह जानने में दिलचस्पी होगी कि क्या कोई बेहतर तरीका है या नहीं।

+0

मैं एक समान हैकिश फिक्स के साथ आया था जिसमें प्रत्येक 'QGraphicsItem' में पिछले स्थान स्टैक शामिल था और फिर आइटम को पूर्ववत स्टैक में बदल दिया गया था। यह बदसूरत है लेकिन यह काम करता है। प्रश्न और उत्तर के लिए धन्यवाद। –