Создание подкласса QGraphicsRectItem в PyQt

benniac74385 спросил: 13 октября 2017 в 06:43 в: python

Я пишу приложение, в котором хочу иметь возможность перемещать прямоугольники, щелкая и перетаскивая их. Код ниже делает это правильно до сих пор

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *import sysclass Memory(QWidget):    grid = None
    scene = None    def __init__(self, geometry, parent=None):
        super(Memory, self).__init__(parent=parent)        self.layout = QGridLayout(self)        self.scene = QGraphicsScene(self)
        self.scene.setSceneRect(geometry.x(), geometry.y(), geometry.width(), geometry.height())
        self.scene.setBackgroundBrush(Qt.white)        self.view = QGraphicsView()
        self.view.setScene(self.scene)        self.layout.addWidget(self.view)        rect = QRectF(40, 40, 220, 110)
        self.make_proxy(rect)        rect2 = QRectF(300, 40, 220, 110)
        self.make_proxy(rect2)    def make_proxy(self, rect):        label = QLabel('World')
        label.setAlignment(Qt.AlignCenter | Qt.AlignCenter)        # create proxy
        proxy = QGraphicsProxyWidget()
        proxy.setWidget(label)
        proxy.setGeometry(rect)
        self.scene.addItem(proxy)        # create parent item
        rectangle = QGraphicsRectItem(rect)
        rectangle.setFlag(QGraphicsItem.ItemIsMovable, True)
        self.scene.addItem(rectangle)        # set parent
        proxy.setParentItem(rectangle)def main():    app = QApplication(sys.argv)
    form = Memory(QRect(10, 10, 550, 180))
    form.show()
    app.exec_()if __name__ == '__main__':
    main()

Тем не менее, первый прямоугольник всегда находится внизу сцены, так как он был сначала добавлен к нему. Но когда я нажимаю на него, он должен перейти к вершине сцены, чтобы она появилась над вторым прямоугольником. Вот почему я хочу создать подкласс QGraphicsRectItem и добавить в него новые функции. Но когда я реализую его, как показано ниже

class RectItem(QGraphicsRectItem):    def __init__(self, rect):
        QGraphicsRectItem.__init__(self)
        self.rectangle = rect    def boundingRect(self):
        super(RectItem, self).boundingRect()
        return self.rectangle

и определю переменную rectangle как

        rectangle = RectItem(rect)

, элементы будут больше не может быть перемещен, т. е. флаг QGraphicsItem.ItemIsMovable не имеет никакого эффекта.

Есть простой способ создать подкласс QGraphicsRectItem и сохранить все вспомогательные функции, такие как setFlag(QGraphicsItem.ItemIsMovable, True) работает?

РЕДАКТИРОВАТЬ:

Как указал eyllanesc, нет необходимости перезаписывать метод boundingRect. Тем не менее, когда я пытаюсь создать подкласс QGraphicsRectItem как

class RectItem(QGraphicsRectItem):    def __init__(self, rect):
        QGraphicsRectItem.__init__(self)

и определить rectangle как

        rectangle = RectItem(rect)

У меня не такое поведение, как с

        rectangle = QGraphicsRectItem(rect)

В чем причина?


0 ответов