2011-11-07 8 views
5

私はQGraphicsItemsの大きなプログラムをQGraphicsWidgetsに変換しています(入力用にアイテムとウィジェットと呼ぶ)。ウィジェットの位置および/または矩形が古いアイテムと同じではないため、マウスのホバーは今失敗します。私は、ビュー、シーン、アイテム、およびウィジェットを持つ簡単なケースに煮詰めました。青のアイテムは100x50 pixでレンダリングされ、hoverEnterEventは期待どおりに発生します。しかし、赤いウィジェットは意図した幅の半分でレンダリングされます。ウィジェットの純粋仮想関数boundingRectを再実装した場合、これを修正できます。しかし、のホバーイベントは、50x50の左半分の上でしかトリガーされません。アイテムのようにウィジェットがマウスと適切にやりとりするためには、どのpos/rect/geometryメソッドを使用する/上書きする必要がありますか?ありがとう。ここに私のサンプルコードQt/PyQt:QGraphicsItemとQGraphicsWidgetのジオメトリ、位置、マウスのやりとり

#!/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)の代わりを使用する場合、正しく動作するように見えるんです。

関連する問題