2013-07-01 61 views
2

我試圖在用戶移動QGraphicsRectItem的子類時獲取boundingRect()。但是,當矩形在場景中移動時,由boundingRect()返回的矩形總是返回邊界矩形的原始值。下面的例子演示了這個問題。當RectItem在場景周圍移動時,爲每個鼠標移動打印boundinRect()的值。爲什麼不是boundingRect()返回新的邊界矩形?我究竟做錯了什麼? QGraphicsRectItem.boundingRect()在移動過程中未更新

from sys import argv 

from PyQt4.Qt import QApplication 
from PyQt4.QtCore import QPointF, QRectF, Qt 
from PyQt4.QtGui import (
    QGraphicsItem, 
    QGraphicsRectItem, 
    QGraphicsScene, 
    QGraphicsView, 
) 


class RectItem(QGraphicsRectItem): 
    def __init__(self, parent): 
     super(RectItem, self).__init__(parent) 
     self.setFlag(QGraphicsItem.ItemIsMovable, enabled=True) 
     self.setFlag(QGraphicsItem.ItemIsSelectable, enabled=True) 

    def mouseMoveEvent(self, event): 
     super(RectItem, self).mouseMoveEvent(event) 
     print self.boundingRect() 


class ViewItem(QGraphicsRectItem): 
    def __init__(self, x, y, width, height, parent=None, scene=None): 
     super(ViewItem, self).__init__(parent, scene) 
     self.setRect(QRectF(x, y, width, height)) 
     self.create_child_item(100, 100) 

    def create_child_item(self, x, y): 
     self.child_item = RectItem(self) 
     self.child_item.setRect(x, y, 200, 100) 
     self.child_item.setSelected(True) 


class View(QGraphicsView): 
    def __init__(self, parent=None): 
     super(View, self).__init__(parent) 
     self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
     self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
     self.setInteractive(True) 
     self.graphics_scene = QGraphicsScene(self) 
     self.setScene(self.graphics_scene) 
     self.setAlignment(Qt.AlignTop) 
     self.add_view_item() 

    def add_view_item(self): 
     self.view_item = ViewItem(0.0, 0.0, 1024.0, 768.0) 
     self.graphics_scene.addItem(self.view_item) 


if __name__ == '__main__': 
    app = QApplication(argv) 
    view = View() 
    view.setGeometry(100, 100, 1024, 768) 
    view.setWindowTitle('View Test') 
    view.show() 
    app.exec_() 

回答

3

QGraphicsItemboundingRect()總是在自己的座標。移動一個項目不會改變它自身的邊界矩。

如果您需要項目相對於場景的邊界框,請使用sceneBoundingRect()