2012-06-15 11 views
7

QGraphicsScene में, मेरे पास कुछ शीर्ष पर QGraphicsItem एस के साथ पृष्ठभूमि सेट है। ये ग्राफिक्स आइटम मनमाने ढंग से आकार के हैं। मैं एक और QGraphicsItem बनाना चाहता हूं, यानी एक सर्कल, जो इन वस्तुओं पर रखे जाने पर रंग से भरने के बजाए अनिवार्य रूप से इस सर्कल के भीतर पृष्ठभूमि दिखाएगा।QGraphicsItem को QGraphicsScene में पृष्ठभूमि दिखाने के लिए कैसे करें?

यह फ़ोटोशॉप में इसके शीर्ष पर कई परतों के साथ पृष्ठभूमि होने जैसा होगा। फिर, सर्कल के भीतर पृष्ठभूमि दिखाने के लिए पृष्ठभूमि के शीर्ष पर सभी परतों को हटाने के लिए एक गोलाकार मार्की उपकरण का उपयोग करना।

या, इसे देखने का एक और तरीका एक अस्पष्टता सेट होना चाहिए, लेकिन यह अस्पष्टता पृष्ठभूमि को दिखाने के लिए सीधे नीचे (लेकिन केवल अंडाकार के भीतर) आइटम को प्रभावित करती है।

+1

एक कार्यक्रम मैं कहा जाता है का उपयोग किया है वास्तविक ड्रा क्या एक "को पीछे धकेलने" वस्तु कहा जाता है के साथ इस सामान्यीकृत। काफी उपयोगी, आप एक समान सामान्यीकरण का उपयोग करने पर विचार कर सकते हैं: http://www.mediachance.com/realdraw/help/index.html?pushback.htm – HostileFork

उत्तर

7

निम्नलिखित काम कर सकते हैं। यह मूल रूप से किसी भी QPainter पर अपनी पृष्ठभूमि को प्रस्तुत करने की क्षमता के साथ सामान्य QGraphicsScene बढ़ाता है। फिर, आपके "कट आउट" ग्राफिक्स आइटम बस अन्य वस्तुओं के शीर्ष पर दृश्य पृष्ठभूमि प्रस्तुत करता है। इसके लिए काम करने के लिए, कट आउट आइटम में उच्चतम जेड-वैल्यू होना चाहिए।

screen shot

#include <QtGui> 

class BackgroundDrawingScene : public QGraphicsScene { 
public: 
    explicit BackgroundDrawingScene() : QGraphicsScene() {} 
    void renderBackground(QPainter *painter, 
         const QRectF &source, 
         const QRectF &target) { 
    painter->save(); 
    painter->setWorldTransform(
      QTransform::fromTranslate(target.left() - source.left(), 
            target.top() - source.top()), 
      true); 
    QGraphicsScene::drawBackground(painter, source); 
    painter->restore(); 
    } 
}; 

class CutOutGraphicsItem : public QGraphicsEllipseItem { 
public: 
    explicit CutOutGraphicsItem(const QRectF &rect) 
    : QGraphicsEllipseItem(rect) { 
    setFlag(QGraphicsItem::ItemIsMovable); 
    } 
protected: 
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { 
    BackgroundDrawingScene *bgscene = 
     dynamic_cast<BackgroundDrawingScene*>(scene()); 
    if (!bgscene) { 
     return; 
    } 

    painter->setClipPath(shape()); 
    bgscene->renderBackground(painter, 
           mapToScene(boundingRect()).boundingRect(), 
           boundingRect()); 
    } 
}; 


int main(int argc, char **argv) { 
    QApplication app(argc, argv); 

    BackgroundDrawingScene scene; 
    QRadialGradient gradient(0, 0, 10); 
    gradient.setSpread(QGradient::RepeatSpread); 
    scene.setBackgroundBrush(gradient); 

    scene.addRect(10., 10., 100., 50., QPen(Qt::SolidLine), QBrush(Qt::red)); 
    scene.addItem(new CutOutGraphicsItem(QRectF(20., 20., 20., 20.))); 

    QGraphicsView view(&scene); 
    view.show(); 

    return app.exec(); 
} 
+0

डेव, बहुत बहुत धन्यवाद। यह कोड बहुत दिलचस्प है। क्या आप इसे अंडाकार को स्थानांतरित करने की अनुमति देने के लिए संशोधित कर सकते हैं? मैं 'setFlag (QGraphicsItem :: ItemIsMovable, true) और setFlag (QGraphicsItem :: ITEMIsSelectable, true)' का उपयोग करके बंद हो गया और 'भेजने के पहले 'MapToScene (shape())' और' mapToScene (rect()) 'का उपयोग भी किया उन पैरामीटर 'रेंडरबैकग्राउंड' फ़ंक्शन के लिए, लेकिन यह थोड़ा सा है। मैं आज रात बाद आपके कोड का अधिक विस्तार से अध्ययन करूंगा। एक बार फिर धन्यवाद। – Justin

+0

ठीक है तो मुझे अभी भी कोई भाग्य नहीं है ... जब मैं उपर्युक्त करता हूं तो यह पृष्ठभूमि से दूर पृष्ठभूमि का अनुवाद करता है क्योंकि 'पेंट' फ़ंक्शन आइटम निर्देशांक का उपयोग करता है जो आइटम को खींचा जाने पर नहीं बदलता है। 'रेंडरबैकग्राउंड' फ़ंक्शन को कॉल करने के बाद चित्रकार ऑब्जेक्ट का अनुवाद करने का कोई तरीका है? – Justin

+0

ओह हाँ, मुझे समस्या दिखाई देती है। उपरोक्त कोड आइटम की स्थिति को संभाला नहीं जा रहा है। (यदि आप दृश्य में जोड़ने से पहले आइटम पर 'setPos()' को कॉल करते हैं तो आपको शायद वही समस्या मिल जाएगी।) मैं अभी किसी भी कोड का परीक्षण करने के लिए किसी स्थान पर नहीं हूं, लेकिन अगर आपके पास Qt के लिए स्रोत कोड है , 'QGraphicsScene :: रेंडर() 'विधि की जांच करें। मुझे यकीन है कि वे अस्थायी रूप से चित्रकार पर परिवर्तन को बदल रहे हैं, पेंट कर रहे हैं, फिर ट्रांसफॉर्म को बहाल कर रहे हैं। क्षमा करें मैं अभी इस पर काम नहीं कर सकता। यदि आप अभी भी अटक गए हैं, तो मैं कल या सोमवार को समाधान पोस्ट करने का प्रयास करूंगा! –

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