2012-07-30 16 views
5

मैं, मैं है एक काम कार्यान्वयन कि कुछ इस तरह चला जाता है क्यूटी 4.x में एक QGraphicsView के लिए एक ज़ूम स्लाइडर एकीकृत करने के लिए एक की जरूरत है निम्नलिखितको लागू करने के लिए ज़ूम स्लाइडर QGraphicsView

void CustomView::setZoomLevel(int level) 
{ 
    if(zoomLevel - level < -1){ 
     setZoomLevel(level - 1); 
    }else if(level - zoomLevel < -1){ 
     setZoomLevel(level + 1); 
    } 
    if(level < zoomLevel){ 
     scale(1 - (scaleFactor * (zoomLevel - level)), 1 - (scaleFactor * (zoomLevel - level))); 
    }else if (level > zoomLevel){ 
     scale(1 + (scaleFactor * (level - zoomLevel)), 1 + (scaleFactor * (level - zoomLevel))); 
    } 

    zoomLevel = level; 
} 

तो मेरी मुद्दा एक स्लाइडर जो QGraphicsView की scale() समारोह है, जो टी द्वारा दृश्य गुणा करने के लिए दो चल बिन्दु मान लेता है करने के लिए एक ज़ूम स्तर का प्रतिनिधित्व करने के मीटर n के एक मूल्य है संभोग से उत्पन्न कर रहा है ओ एक नया आकार प्राप्त करें।

तो यदि समस्या 1 * .9 * 1.1 लेती है तो आपको अभी भी 1 नहीं मिलता है, लेकिन आपको इसके बजाय 1 99 नहीं मिलता है, बल्कि इसके .99, यह थोड़ा सही है क्योंकि यह सही सूत्र नहीं है। तो मेरा अधिकतम ज़ूम समय के साथ छोटा और छोटा हो जाता है।

रिकर्सिव कॉल इसलिए हैं क्योंकि स्लाइडर कभी-कभी तेज स्लाइड पर मूल्यों को छोड़ देता है, जिसने "त्रुटि" में वृद्धि की है, इसलिए मैंने इसे थोड़ा सा पट्टी करने के लिए इसे चिकना कर दिया।

क्या ज़ूम को संभालने का कोई सही तरीका है?

उत्तर

7

मुझे यह पता लगाने में थोड़ी देर लग गई। समस्या यह है कि QGraphicsView :: स्केल() वर्तमान पैमाने के स्तर के साथ स्केल स्तर को जोड़ती है। इसके बजाय का प्रयास करें: documentation में

setTransform(QTransform::fromScale(sx, sy)); 

सूचना यह है कि combine = false का एक वैकल्पिक दूसरा पैरामीटर। यह अच्छा है क्योंकि आप ट्रांसफॉर्म को गठबंधन नहीं करना चाहते हैं।

यदि आपके स्केलिंग के अलावा आपके QGraphicsView पर अन्य परिवर्तन हैं, तो उपर्युक्त सुझाव उन्हें त्याग देगा। उस स्थिति में आप वर्तमान ट्रांसफॉर्म प्राप्त करने के लिए QGraphicsView::transform() का उपयोग करेंगे, जिसे आप फिर भी बदल सकते हैं, और फिर इसे फिर से सेट करने के लिए QGraphicsView::setTransform() का उपयोग करें।

+0

आपको बहुत बहुत धन्यवाद। यह वास्तव में स्केल() के तहत प्रलेखन में उल्लेख किया जाना चाहिए। –

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