2011-11-07 13 views
5

मैं क्यूग्राफिक्स इटम्स के क्यूग्राफिक्सविजेट्स के एक बड़े कार्यक्रम को परिवर्तित कर रहा हूं (चलिए उन्हें टाइपिंग के लिए आइटम और विजेट कहते हैं)। माउस होवर अब विफल रहता है क्योंकि विजेट की स्थिति और/या रेक्ट पुराने आइटम के समान नहीं हैं। मैंने एक दृश्य, दृश्य, एक आइटम और विजेट के साथ एक साधारण मामले में उबला हुआ है। नीली वस्तु 100x50 पिक्स पर प्रस्तुत होती है, और होवरएन्टरएवेंट अपेक्षा के अनुसार होता है। हालांकि, लाल विजेट आधा इच्छित चौड़ाई पर प्रदान किया जाता है। अगर मैं विजेट के लिए शुद्ध वर्चुअल फ़ंक्शन बाउंडिंग रेक्ट को पुन: कार्यान्वित करता हूं लेकिन होवर ईवेंट अभी भी केवल 50x50 बाएं आधे से ऊपर ट्रिगर किया गया है, तो मैं इसे ठीक कर सकता हूं। विजेट को आइटम की तरह माउस के साथ ठीक से बातचीत करने के लिए मुझे क्या पॉज़/रेक्ट/ज्यामिति विधियों का उपयोग/ओवरराइड करने की आवश्यकता है? धन्यवाद। यहाँ मेरी नमूना कोडक्यूटी/पीईक्यूटी: क्यूग्राफिक्स इटैम बनाम क्यूग्राफिक्स विजिट ज्यामिति, स्थिति, माउस इंटरैक्शन

#!/usr/local/bin/python 

import os, sys 
from PyQt4.Qt import * 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class MyView(QGraphicsView): 
    def __init__(self): 
     QGraphicsView.__init__(self) 
     self.setWindowFlags(Qt.WindowStaysOnTopHint) 
     self.scene = QGraphicsScene(self) 
     self.item = GraphicsItem('item', 100, 50) 
     self.item.moveBy(50, 50) 
     self.scene.addItem(self.item) 
     self.widget = GraphicsWidget('widget', 100, 50) 
     self.scene.addItem(self.widget) 
     self.setScene(self.scene) 

class GraphicsItem(QGraphicsItem): 
    def __init__(self, name, width, height): 
     QGraphicsItem.__init__(self) 
     self.setAcceptHoverEvents(True) 
     self.name = name 
     self.__width = width 
     self.__height = height 

    def boundingRect(self): 
     return QRectF(0, 0, self.__width, self.__height) 

    def hoverEnterEvent(self, event): 
     self.__printGeometryDetails() 

    def paint(self, painter, option, widget): 
     bgRect = self.boundingRect() 
     painter.drawRects(bgRect) 
     painter.fillRect(bgRect, QColor('blue')) 

    def __printGeometryDetails(self): 
     print self.name 
     print ' pos (%.0f, %0.0f)' % (self.pos().x(), self.pos().y()) 
     print ' boundingRect (%.0f, %0.0f, %.0f, %0.0f)' % (self.boundingRect().x(), self.boundingRect().y(), self.boundingRect().width(), self.boundingRect().height()) 

class GraphicsWidget(QGraphicsWidget): 
    def __init__(self, name, width, height): 
     QGraphicsWidget.__init__(self) 
     self.setAcceptHoverEvents(True) 
     self.name = name 
     self.__width = width 
     self.__height = height 

    def boundingRect(self): 
     return QRectF(0, 0, self.__width, self.__height) 

    def hoverEnterEvent(self, event): 
     self.__printGeometryDetails() 

    def paint(self, painter, option, widget): 
     bgRect = self.boundingRect() 
     painter.drawRects(bgRect) 
     painter.fillRect(bgRect, QColor('red')) 

    def __printGeometryDetails(self): 
     print self.name 
     print ' pos (%.0f, %0.0f)' % (self.pos().x(), self.pos().y()) 
     print ' boundingRect (%.0f, %0.0f, %.0f, %0.0f)' % (self.boundingRect().x(), self.boundingRect().y(), self.boundingRect().width(), self.boundingRect().height()) 
     print ' geometry (%.0f, %0.0f, %.0f, %0.0f)' % (self.geometry().x(), self.geometry().y(), self.geometry().width(), self.geometry().height()) 
     print ' rect (%.0f, %0.0f, %.0f, %0.0f)' % (self.rect().x(), self.rect().y(), self.rect().width(), self.rect().height()) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    view = MyView() 
    view.setGeometry(600, 100, 400, 370) 
    view.show() 
    sys.exit(app.exec_()) 

उत्तर

5

है अगर आप के बजाय boundingRect को पुनर्परिभाषित करने की self.resize(width, height) का उपयोग सही ढंग से काम करने के लिए प्रतीत होता है।

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