首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动过程中未更新QGraphicsRectItem.boundingRect()

移动过程中未更新QGraphicsRectItem.boundingRect()
EN

Stack Overflow用户
提问于 2013-07-02 02:00:02
回答 1查看 2.3K关注 0票数 5

当用户移动QGraphicsRectItem的子类时,我尝试获取它的boundingRect()。但是,当矩形在场景中移动时,由boundingRect()返回的矩形始终返回边界矩形的原始值。下面的例子演示了这个问题。当RectItem在场景中移动时,将为每次鼠标移动打印boundinRect()的值。为什么boundingRect()不返回新的边界矩形?我做错了什么?

代码语言:javascript
复制
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_()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-02 02:12:01

QGraphicsItemboundingRect()总是在它自己的坐标中,移动一个项目并不会改变它相对于它自己的边框。

如果需要项目相对于场景的边界框,请使用sceneBoundingRect()

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17410739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档