2009-06-24 8 views
8

मैं क्यूटी 4 में विजेट प्रदर्शित कुछ ग्राफिक डेटा बना रहा हूं साथ एक QGraphicsScene का उपयोग करना चाहिए और मैं इसके लिए QGraphicsScene उपयोग करने के लिए, डेटा आइटम आदि के लिए QGraphicsItem s बनानेमैं कैसे लेआउट और विगेट्स

हालांकि परीक्षा किया गया था, मैं नियंत्रण की कुछ परत जोड़ना चाहता था (उदाहरण के लिए स्क्रॉलबार, ज़ूम + अन्य बटन - मैं इसे इसी तरह की शैली में बनाना चाहता हूं जैसे कि Google मानचित्र, यानी, डेटा पूरे विजेट पर प्रदर्शित होगा, और बटन विजेट के ऊपर उन्हें दिखाया जाना चाहिए)। तो मैंने सोचा कि उन्हें दृश्य में जोड़ने के लिए संभव हो सकता है (शायद QGraphicsGroupItem के बच्चे के रूप में जो डेटा पर दिखाया जाएगा)। लेकिन मैं चाहता हूं कि जब मैं पूरे विजेट का आकार बदलूं, तो & आकार बदलें, इसलिए मुझे उन्हें प्रबंधित करने के लिए QGraphicsLayout का उपयोग करना चाहिए। लेकिन इस बिंदु पर, मैंने पाया कि चीजें बहुत जटिल हैं।

समस्या यह है कि जब QGraphicsLayout उपयोग करते हुए, निम्नलिखित की कमी पकड़ है:

  1. केवल एक QGraphicsWidget एक लेआउट द्वारा प्रबंधित किया जा सकता
  2. QGraphicsLayout केवल एक QGraphicsWidget
के बच्चों का प्रबंधन करने के लिए इस्तेमाल किया जा सकता है

जिसका अर्थ है कि मुझे अपने नियंत्रण QGraphicsWidget एस के रूप में बनाना होगा, डेटा विजेट पर शीर्ष स्तर QGraphicsWidget जोड़ें, और टी प्रबंधित करें वह खुद को इस शीर्ष स्तर विजेट का आकार।

तो मैं पूछना चाहता हूँ:

  1. एक क्लासिक दृष्टिकोण (यानी सभी नियंत्रण के लिए सादे पुराने विजेट का उपयोग, और केवल डेटा प्रदर्शित करने के लिए QGraphicsScene का उपयोग करें।) नहीं चाहेंगे अधिक उचित हो सकता है?

  2. क्या इस मामले में QGraphicsScene का उपयोग करने में कोई फायदा है (प्रदर्शन या सादगी ...)?

  3. मैं अपनी शक्तियों का शोषण करने के लिए QGraphicsScene का उपयोग कैसे करना चाहिए?

उत्तर

1

अगर आपको लगता है कि QGraphicsScene (या जो भी अन्य विजेट आपके पास) अपने प्रदर्शन के अधिकांश के लिए उपयुक्त है, का उपयोग करें। हमने कुछ हद तक समान चीजों के लिए अतीत में क्या किया है, एक कस्टम विजेट बनाना है जो QWidget से विरासत (एक तरफ या दूसरा) प्राप्त करता है, और उस विजेट के शीर्ष पर नियंत्रण विजेट को लेआउट में डाल देता है। इसका मतलब यह है कि पूरा विजेट जो भी आप चाहते हैं उसे खींचा जा रहा है, और नियंत्रण विजेट उस के शीर्ष पर हैं, पूरे विजेट का आकार बदलकर आकार बदल रहा है।

वैकल्पिक रूप से, हमारे पास लेआउट विजेट्स के लिए आसानी से संभालने के लिए कुछ समय जटिल थे जो हमारे पास लेआउट थे। एक कस्टम लेआउट बनाने के बजाय, हमने उन्हें बिना किसी लेआउट के रखा है, और उन्हें आकार बदलने पर ईवेंट में स्थानांतरित कर दिया है। यह भी काम करता है।

+0

QGraphicsScene साथ सबसे बड़ी समस्या यह है कि यह वास्तव में एक विजेट नहीं है। यह सामानों (जैसे आयतों, इलिप्स ...) की तरह कुछ है जो स्वचालित रूप से खींचे जाते हैं, ज़ूम किया जा सकता है आदि। आप जो वर्णन करते हैं वह क्लासिक, सादा पुराना विजेट तरीका है, और मैं शायद उस पर चिपके रहूंगा।मैं "चमकदार और नई" कार्यक्षमता का उपयोग करना चाहता था, लेकिन दूसरे विचार पर, यह मेरे लिए चमकदार नहीं दिखता है, सिवाय किसी को मुझे गलत साबित करता है :) – jpalecek

+0

jpalecek: "घड़ियों" विजेट डेमो @ http: // की जांच करें www.qtsoftware.com/developer/pimp-my-widgets-developer-contest .. घड़ी विजेट होने पर कुछ भी पसंद नहीं है लेकिन इसके लिए कार्यान्वयन QGraphics (दृश्य | विजेट | देखें | आइटम) के साथ किया जाता है। – rasjani

+0

@jpalecek: मुझे नहीं लगता था कि एक QGraphicsScene एक विजेट था, यही कारण है कि मैंने "एक तरफ या किसी अन्य" का उत्तराधिकारी कहा। लेकिन आपके पास QGraphicsView (या कुछ समान) है, है ना? आप शायद अपने विजेट को उस पर रखना चाहते हैं, जब तक कि आप उन्हें अपने दृश्य में बदलना नहीं चाहते। मुझे लगता है कि इस मामले में सादा पुराना विजेट तरीका सरल और अधिक सीधे आगे है। –

6

क्यूटी 4.4 जब से तुम QGraphicsProxyWidget का उपयोग करके एक QGraphicsScene में क्लासिक विजेट एम्बेड कर सकते हैं:

QWidget *widget = new QWidget; 
QGraphicsScene scene; 
QGraphicsProxyWidget *proxy = scene.addWidget(widget);