2011-11-07 19 views
5

QGraphicsItems'in daha büyük bir programını QGraphicsWidgets'a dönüştürüyorum (onlara sake yazmanız için öğe ve widget'ı diyelim). Artık fare geçişi başarısız oluyor, çünkü widget'ların konumu ve/veya rektisi eski öğelerle aynı değil. Bir manzara, sahne, bir öğe ve bir widget ile basit bir duruma düştüm. Mavi öğe 100x50 piksellikle oluşturulur ve hoverEnterEvent beklendiği gibi gerçekleşir. Bununla birlikte, kırmızı parçacık yarısı istenen genişlikte oluşturulur. Eğer widget ama için sınırlayıcı sanal işlevi sınırlandırıyorsa, bu durumda hover olayı hala sadece 50x50 sol yarısının üstünde tetiklenir. Widget'ı, öğe gibi fareyle düzgün bir şekilde etkileşime girmek için hangi poz/rect/geometri yöntemlerini kullanmam gerekiyor/geçersiz kılmalıyım? Teşekkürler. İşte Size yerine boundingRect yeniden tanımlama self.resize(width, height) kullanıyorsanız düzgün çalışması gibi görünüyor benim örnek kodQt/PyQt: QGraphicsItem vs. QGraphicsWidget geometrisi, konum, fare etkileşimi

#!/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_()) 

cevap