2012-02-29 25 views
8

को समझने की कोशिश कर रहा हूं, मैं क्यूग्राफिक्स व्यू और क्यूग्राफिक्ससेन की समझ बनाने की कोशिश कर रहा हूं, विशेष रूप से ग्राफिक्स आइटम कैसे रखें और उन्हें वहां दिखाई दें जहां मैं उन्हें चाहता हूं। जब मैं दृश्य क्षेत्र से दृश्य बड़ा होता हूं तो स्क्रॉल बार दिखाई देगा जब मैं भी उलझन में हूं।पीईक्यूटी: ग्राफिक्स दृश्य/दृश्य

उदाहरण के लिए, कोड के इस बिट एक छोटे से ग्राफिक्स शीर्ष कोने में एक दीर्घवृत्त के साथ देखने का निर्माण करेगा:,

import sys 
from PyQt4 import QtGui, QtCore 

class MyView(QtGui.QGraphicsView): 
    def __init__(self): 
     QtGui.QGraphicsView.__init__(self) 

     self.scene = QtGui.QGraphicsScene(self) 
     self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245)) 

     self.setScene(self.scene) 

     self.item = QtGui.QGraphicsEllipseItem(0, 0, 60, 40) 
     self.scene.addItem(self.item) 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    view = MyView() 
    view.show() 
    sys.exit(app.exec_()) 

लेकिन अगर self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245)) छोड़ दिया जाता है, तो अंडाकार के बीच में प्रकट होता है खिड़की के बावजूद खिड़की x, y = 0,0 है। मुझे यकीन नहीं है क्यों! क्या इस व्यवहार का कोई कारण है?

इसी तरह, दृश्य दृश्य आकार से बड़ा होने पर मैं स्क्रॉलबार की उपस्थिति के बारे में उलझन में हूं। उदाहरण के लिए, निम्न कोड कई इलिप्स के साथ दृश्य/दृश्य बनाता है, और itemsBoundingRectsceneRect से बड़ा है। केवल कुछ अंडाकार दिखाए जाते हैं, लेकिन छुपे हुए लोगों को देखने के लिए कोई स्क्रॉलबार नहीं है, आपको विंडो के आकार को बढ़ाना होगा। लेकिन जब आप ऐसा करते हैं, तो इलिप्स की शिफ्ट की जगह बदलती है, इसलिए इलिप्स के एक्स, वाई को नजरअंदाज कर दिया जाता है। self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200)) लाइन छोड़ दिया जाता है

import sys 
from PyQt4 import QtGui, QtCore 

class MyView(QtGui.QGraphicsView): 
    def __init__(self): 
     QtGui.QGraphicsView.__init__(self) 

     self.setGeometry(QtCore.QRect(100, 100, 250, 250)) 

     self.scene = QtGui.QGraphicsScene(self) 
     self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200)) 

     self.setScene(self.scene) 

     for i in range(5): 
      self.item = QtGui.QGraphicsEllipseItem(i*75, 10, 60, 40) 
      self.scene.addItem(self.item) 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    view = MyView() 
    view.show() 
    sys.exit(app.exec_()) 

है, तो एक स्क्रॉलबार दिखाई देता है। लेकिन फिर, इलिप्स के एक्स, वाई पदों को नजरअंदाज कर दिया जाता है, और वे दृश्य में केंद्रित होते हैं।

जो मैं करने की कोशिश कर रहा हूं वह है: एक दृश्य बनाएं जहां आइटम उन्हें जाना चाहते हैं, और यदि आइटम की संख्या दृश्य आकार से बड़ी हो, तो स्क्रॉलबार दिखाई देने के लिए, लेकिन एक्स के लिए, ऑब्जेक्ट्स की वाई स्थिति बनाए रखने के लिए।

मुझे लगता है कि मैं दृश्य/दृश्य पहेली के कुछ महत्वपूर्ण टुकड़ा याद कर रहा हूँ ...

उत्तर

3

दस्तावेज़

तो दृश्य रेक्ट सेट नहीं होने से, PySide.QtGui.QGraphicsScene का उपयोग करेगा सभी चीजों का बाध्यकारी क्षेत्र, जैसा कि PySide.QtGui.QGraphicsScene.itemsBoundingRect() द्वारा दृश्य दृश्य के रूप में लौटाया गया है।

तो यह आपकी छवि के रेक्ट को आपके दृश्य रेक्ट के रूप में सेट कर रहा है और दृश्य का केंद्र विजेट का केंद्र है।

जब दृश्य रेक्ट विजेट आकार से बड़ा होता है तो स्क्रॉल बार दिखाई देंगे। जब आप setSceneRect लाइन पर टिप्पणी करते हैं तो आपके दृश्य को स्वचालित रूप से आकार दिया जा रहा है, लेकिन जब आपके पास लाइनें हैं तो आपकी छवियों को scenRect की सीमाओं के पीछे जोड़ा जा रहा है, इसलिए आपको इसे दिखाने के लिए अपने sceneRect को अपडेट करना होगा।

+0

धन्यवाद @ जेफ। मैंने देखा है कि 'setGeometry' कॉल भी स्क्रॉलबार दिखाई देने पर एक भूमिका निभाता है। दूसरे उदाहरण में, स्क्रॉलबार तब दिखाई देते हैं जब 'सेट जीमेट्री' कहा जाता है लेकिन 'setSceneRect' _not_ कहा जाता है। स्वाभाविक रूप से, यदि न तो कहा जाता है, तो दृश्य स्वचालित रूप से सभी वस्तुओं को फिट करने के लिए समायोजित करता है ('आइटम्सबाउंडिंगरक्ट' के अनुरूप)। यदि _both_ कहा जाता है, तो केवल 'setSceneRect' द्वारा परिभाषित दृश्य दिखाया गया है, बिना स्क्रॉलबार के। – XandYandZ

1
import sys from PyQt4 import QtGui, QtCore 

class MyView(QtGui.QGraphicsView): 
    def __init__(self): 
     QtGui.QGraphicsView.__init__(self) 

     self.setGeometry(QtCore.QRect(100, 100, 600, 250)) 

     self.scene = QtGui.QGraphicsScene(self) 
     self.scene.setSceneRect(QtCore.QRectF()) 

     self.setScene(self.scene) 

     for i in range(5): 
      self.item = QtGui.QGraphicsEllipseItem(i*75, 10, 60, 40) 
      self.scene.addItem(self.item) 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    view = MyView() 
    view.show() 
    sys.exit(app.exec_()) 
संबंधित मुद्दे