2009-08-03 16 views
7

स्केल करते समय स्केल आइटम न करें I Qt QsraphicsView- और QGraphicsItem-Subclasses का उपयोग कर रहा हूं। दृश्य आयत बदलते समय आइटम के आलेखीय प्रतिनिधित्व को स्केल करने का कोई तरीका नहीं है, उदा। जब ज़ूम इन करते हैं। डिफ़ॉल्ट व्यवहार यह है कि मेरे आइटम आयत आयत के संबंध में स्केल करते हैं।क्यूग्राफिक्स व्यू और क्यूग्राफिक्स इटिम: व्यू रेक्ट

मैं 2 डी बिंदुओं को विज़ुअलाइज़ करना चाहता हूं जिन्हें पतली आयताकार द्वारा दर्शाया जाना चाहिए जो दृश्य में ज़ूम करते समय स्केल नहीं करना चाहिए। संदर्भ के लिए एक सामान्य 3 डी मॉडलिंग सॉफ्टवेयर देखें जहां वर्टेक्स अंक हमेशा एक ही आकार में दिखाए जाते हैं।

धन्यवाद!

+1

इसके अलावा http://doc.trolltech.com/4.5/qpen.html#setCosmetic एक चोटी पर आप एक कस्टम रंग दिनचर्या – mpen

उत्तर

9

आइटम का ध्वज QGraphicsItem :: ItemIgnores ट्रान्सफॉर्मेशन सत्य पर आपके लिए काम नहीं करता है?

+4

यह वास्तव में सुनिश्चित करता है आइटम का आकार सही है उपयोग कर रहे हैं ले, लेकिन कम से कम मेरे मामले में स्थिति परिवर्तन के बाद बंद हैं। उदाहरण के लिए, जब मैं अपने ऐप में बहुभुज खींचता हूं, और एक असुरक्षित (1: 1) दृश्य में बाल आयताकार आइटम जोड़ता हूं, तो मुझे निम्न परिणाम मिलता है: http://grafit.mchtr.pw.edu.pl/~szczedar/ nozoom.png। झंडा सेट के साथ स्केलिंग के साथ, ऐसा लगता है: http://grafit.mchtr.pw.edu.pl/~szczedar/zoomout.png – neuviemeporte

+1

दस्तावेज़ कहते हैं कि ध्वज सेट वाला आइटम माता-पिता को लगाया जाता है, लेकिन मैंने पॉलीगॉन के साथ रेक्ट ऑब्जेक्ट को माता-पिता के रूप में बनाया और यह काम नहीं किया।अंतर्निहित पिक्समैप आइटम को माता-पिता के रूप में भी आज़माएं, कोई बदलाव नहीं। – neuviemeporte

2

इस बारे में कैसे:

#include <QtGui/QApplication> 
#include <QtGui/QGraphicsScene> 
#include <QtGui/QGraphicsView> 
#include <QtGui/QGraphicsRectItem> 

int main(int argc, char* argv[]) { 
    QApplication app(argc, argv); 
    QGraphicsScene scene; 
    scene.addText("Hello, world!"); 
    QRect rect(50, 50, 100, 100); 
    QGraphicsRectItem* recti = scene.addRect(rect); 
    QGraphicsView view(&scene); 

    // Set scale for the view 
    view.scale(10.0, 5.0); 

    // Set the inverse transformation for the item 
    recti->setTransform(view.transform().inverted()); 

    view.show(); 
    return app.exec(); 
} 

आप देख सकते हैं पाठ को बढ़ाया है, लेकिन आयत नहीं है। ध्यान दें कि यह न केवल आयताकार के लिए स्केलिंग को रोकता है बल्कि अन्य परिवर्तन भी करता है।

1

मैंने पाया कि मैं क्या कर सकते हैं

void MyDerivedQGraphicsItem::paint(QPainter *painter, 
            const QStyleOptionGraphicsItem *option, 
            QWidget *widget) 
{ 
    double scaleValue = scale(); 
    double scaleX = painter->transform().m11(); 
    setScale(scaleValue/scaleX); 
    QGraphicsSvgItem::paint(painter,option,widget); 
} 

अगर मैं एक नया वर्ग निकाले जाते हैं और रंग समारोह reimpliment यह है कि मैं अब तक पाया है यह ऐसा करने का सबसे अच्छा तरीका है, लेकिन मैं अभी भी चारों ओर फेर कर रहा हूँ।

+1

एचएम। यह मेरे लिए काम नहीं करता है (मेरे मामले में मैं QGraphicsEllipseItem subclassing हूँ)। जब मैं दृश्य ज़ूम करता हूं तो आइटम अभी भी बड़ा हो जाता है। क्या आपने ऊपर के अलावा कुछ भी किया है? – estan

+0

बह क्षमा करें, यह वास्तव में काम किया था। लेकिन अगर आपको कोई और रास्ता मिल गया तो मुझे दिलचस्पी होगी? क्योंकि जब मैं दृश्य को तेजी से ज़ूम करता हूं (स्क्रोल व्हील का उपयोग करके) मैं कुछ झिलमिलाहट देख सकता हूं:/ – estan

+0

क्षमा करें, नहीं, मुझे अभी भी इसके साथ कुछ समस्याएं थीं लेकिन इसे छोड़ दिया गया। – enriched

3

मुझे एक ही समस्या में आई, और इसे समझने में मुझे कुछ समय लगा। इस तरह मैंने इसे हल किया।

एक QGraphicsItem वर्ग बढ़ाएं, पेंट ओवरराइड करें()। पेंट() के अंदर, परिवर्तन के स्केलिंग कारक को 1 (जो एम 11 और एम 22 हैं) को रीसेट करें, और रीसेट से पहले एम 11 (एक्स स्केलिंग कारक) और एम 22 (वाई स्केलिंग कारक) को सहेजें। फिर, सामान्य रूप से ऐसा करें जैसे ड्रॉ करें लेकिन एम 22 के साथ एम एक्स और वाई के साथ अपने एक्स को गुणा करें। यह डिफ़ॉल्ट परिवर्तन के साथ चित्रण से बचाता है, लेकिन स्पष्ट रूप से दृश्य के परिवर्तन के अनुसार पदों की गणना करता है।

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget) 
{ 
    QTransform t = painter->transform(); 
    qreal m11 = t.m11(), m22 = t.m22(); 
    painter->save(); // save painter state 
    painter->setTransform(QTransform(m11, t.m12(), t.m13(), 
            t.m21(), 1, t.m23(), t.m31(), 
            t.m32(), t.m33())); 
    int x = 0, y = 0; // item's coordinates 
    painter->drawText(x*m11, y*m22, "Text"); // the text itself will not be scaled, but when the scene is transformed, this text will still anchor correctly 
    painter->restore(); // restore painter state 
} 

निम्नलिखित कोड ब्लॉक डिफ़ॉल्ट परिवर्तन के साथ आ रहा है

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget) 
{ 
    int x = 0, y = 0; 
    painter->drawText(x, y, "Text"); 
} 

आप दोनों का अंतर देखने की कोशिश कर सकते हैं। उम्मीद है की यह मदद करेगा।

1

निम्नलिखित समाधान मेरे लिए पूरी तरह से काम किया:

void MyDerivedQGraphicsItem::paint(QPainter *painter, const StyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    double scaleValue = scale()/painter->transform().m11(); 
    painter->save(); 
    painter->scale(scaleValue, scaleValue); 
    painter->drawText(...); 
    painter->restore(); 
    ... 
} 

हम अन्य mesures द्वारा scaleValue हम इसके आकार को बचाने/बहाल वातावरण के बाहर निरंतर रखना चाहते गुणा कर सकते हैं।

QPointF ref(500, 500); 
    QPointF vector = scaleValue * QPointF(100, 100); 
    painter->drawLine(ref+vector, ref-vector); 
संबंधित मुद्दे