2010-12-02 10 views
6

मेरे पास एक कस्टम QGraphicsItem कार्यान्वयन है। मुझे उस सीमा को सीमित करने में सक्षम होना चाहिए जहां आइटम स्थानांतरित किया जा सकता है - i, e। इसे एक निश्चित क्षेत्र तक सीमित करें। जब मैं क्यूटी प्रलेखन जाँच की इस यह क्या सुझाव दिया है:QGraphicsItem एक स्थिति परिवर्तन को सत्यापित करने

QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value) 
{ 
    if (change == ItemPositionChange && scene()) { 
     // value is the new position. 
     QPointF newPos = value.toPointF(); 
     QRectF rect = scene()->sceneRect(); 
     if (!rect.contains(newPos)) { 
      // Keep the item inside the scene rect. 
      newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left()))); 
      newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top()))); 
      return newPos; 
     } 
    } 
    return QGraphicsItem::itemChange(change, value); 
} 

तो बुनियादी तौर पर, स्थिति itemChange के लिए पारित जाँच, और यदि आप इसे पसंद नहीं है, इसे बदलने के लिए और नए मूल्य वापस।

काफी सरल लगता है, सिवाय इसके कि यह वास्तव में काम नहीं करता है। जब मैंने कॉल स्टैक की जांच की तो मुझे लगता है कि उस आइटम को QGraphicsItem :: setPos से कॉल किया जा रहा है, लेकिन यह रिटर्न वैल्यू को भी नहीं देखता है। तो मुझे एक बदली हुई स्थिति लौटने का कोई मकसद नहीं है, कोई भी इसे देख रहा है। QGraphicsItem.cpp से कोड देखें

// Notify the item that the position is changing. 
    const QVariant newPosVariant(itemChange(ItemPositionChange, qVariantFromValue<QPointF>(pos))); 
    QPointF newPos = newPosVariant.toPointF(); 
    if (newPos == d_ptr->pos) 
     return; 

    // Update and repositition. 
    d_ptr->setPosHelper(newPos); 

    // Send post-notification. 
    itemChange(QGraphicsItem::ItemPositionHasChanged, newPosVariant); 
    d_ptr->sendScenePosChange(); 

कोई सुझाव? मैं आशा करता था कि पूरे क्लिक को पुन: कार्यान्वित करने से बचें और माउस-डाउन माउस-मूव इत्यादि का उपयोग कर खुद को खींचें ..., लेकिन मुझे लगता है कि मुझे एक बेहतर विचार नहीं मिल रहा है।

उत्तर

4

मैंने वास्तव में कोशिश नहीं की लेकिन मुझे लगता है कि यह वापसी की स्थिति की जांच कर रहा है। newPos में परिवर्तित करने के लिए newPosVariant के कन्स्ट्रक्टर में लौटा प्रतिबंधित स्थिति का उपयोग किया जाता है। इसके बाद यह आइटम की स्थिति सेट करने के लिए उपयोग किया जाता है यदि यह वर्तमान से अलग है।

+1

आह! मैं अपनी समस्या देखता हूं। मेरे वास्तविक कोड में, मैं ItemPositionChange के बजाय ItemPositionHasChanged की जांच कर रहा था। जिसका मतलब है कि मेरी सभी स्थिति जांच गलत कॉल में हो रही है आइटम बदलें - वह जो रिटर्न प्रकार की जांच नहीं करता है। मैं जो कर रहा था उस पर मुझे फिर से देखने के लिए धन्यवाद। वह मेरा मूर्ख था। – Liz

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