2

別のという名前の子である という名前QGraphicsItemがあります。親がないように、親を外す必要があります。child_itemQGraphicsItemparent_itemchild_itemparent_itemchild_item

しかしchildItem.setItemParent(None)、スクリプトを試してみるとクラッシュします。

どうやらこれはQGraphicsItem、このように a の親を削除すると、アイテムが Qt に返されるためです...

今のところ、 を作成したglobal_parent QGraphicsItemので、親を外す必要がある項目がある場合は、 の下で親にするだけで、親があるglobal_parent場合、コードはQGraphicsItemglobal_parentを持たないように動作しますが、より良い解決策が必要です。

アイデアはありますか?

私のコードの一部:

POINT_SIZE = 7
class Test_Box(QGraphicsItem):
    # Constants
    WIDTH           = 50 * POINT_SIZE
    HEIGHT          = 13 * POINT_SIZE
    RECT            = QRectF(0, 0, WIDTH, HEIGHT)
    CORNER_RADIUS   = 1.5 * POINT_SIZE


    def __init__(self, position, parent=None):
        super(Test_Box, self).__init__(parent)

        # Settings
        self.setFlags(  self.flags()                            |
                        QGraphicsItem.ItemIsSelectable          |
                        QGraphicsItem.ItemIsMovable             |
                        QGraphicsItem.ItemIsFocusable           |
                        QGraphicsItem.ItemSendsScenePositionChanges )
        self.setPos(position)


    def boundingRect(self):
        return Test_Box.RECT


    def paint(self, painter, option, widget):
        # Draw Box
        brush   = QBrush()
        painter.setBrush(brush) 
        painter.drawRoundedRect(Test_Box.RECT, Test_Box.CORNER_RADIUS, Test_Box.CORNER_RADIUS)



    def itemChange(self, change, variant):
        super(Test_Box, self).itemChange(change, variant)
        if change == QGraphicsItem.ItemScenePositionHasChanged:
            self.setParentItem(None)
        return QGraphicsItem.itemChange(self, change, variant)

setItemParent を呼び出してアイテムの親を別のアイテムに設定しても機能するので、当面は汎用の親を使用します。

4

1 に答える 1

3

それがタイプミスでない場合setParent、それはあなたの問題です。AにはメソッドQGraphicsItemがなくsetParent、エラーが発生するはずです。むしろ使用する必要がありますsetParentItem

children.setParentItem(None)

編集

あなたのアイテムに基づいてテストケースを作成しました:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

POINT_SIZE = 7
class Test_Box(QGraphicsItem):
    # Constants
    WIDTH           = 50 * POINT_SIZE
    HEIGHT          = 13 * POINT_SIZE
    RECT            = QRectF(0, 0, WIDTH, HEIGHT)
    CORNER_RADIUS   = 1.5 * POINT_SIZE


    def __init__(self, position, parent=None):
        super(Test_Box, self).__init__(parent)

        # Settings
        self.setFlags(  self.flags()                            |
                        QGraphicsItem.ItemIsSelectable          |
                        QGraphicsItem.ItemIsMovable             |
                        QGraphicsItem.ItemIsFocusable           |
                        QGraphicsItem.ItemSendsScenePositionChanges )
        self.setPos(position)


    def boundingRect(self):
        return Test_Box.RECT


    def paint(self, painter, option, widget):
        # Draw Box
        brush   = QBrush()
        painter.setBrush(brush) 
        painter.drawRoundedRect(Test_Box.RECT, Test_Box.CORNER_RADIUS, Test_Box.CORNER_RADIUS)



    def itemChange(self, change, variant):
        super(Test_Box, self).itemChange(change, variant)
        if change == QGraphicsItem.ItemScenePositionHasChanged:
            self.setParentItem(None)
        return QGraphicsItem.itemChange(self, change, variant)


class Window(QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.scene = QGraphicsScene()

        self.item1 = Test_Box(QPointF(0, 0))
        self.item2 = Test_Box(QPointF(20, 20))
        self.item11 = Test_Box(QPointF(10, 5), self.item1)

        self.scene.addItem(self.item1)
        self.scene.addItem(self.item2)

        self.view = QGraphicsView(self.scene)

        self.listItems = QPushButton('list')
        self.listItems.clicked.connect(self.printItems)

        layout = QHBoxLayout()
        layout.addWidget(self.view)
        layout.addWidget(self.listItems)
        self.setLayout(layout)

    def printItems(self):
        for item in self.scene.items():
            print item, item.parentItem()


app = QApplication(sys.argv)

w = Window()
w.show()

sys.exit(app.exec_())

期待どおりに動作しますが、奇妙な動作がいくつか見つかりました。クラス内のアイテムの参照を保持しない場合Window、つまり次のことを行うと、アイテムを移動するとアプリケーションがクラッシュします。

class Window(QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.scene = QGraphicsScene()

        item1 = Test_Box(QPointF(0, 0))
        item2 = Test_Box(QPointF(20, 20))
        item11 = Test_Box(QPointF(10, 5), item1)

        self.scene.addItem(item1)
        self.scene.addItem(item2)

        self.view = QGraphicsView(self.scene)

        self.listItems = QPushButton('list')
        self.listItems.clicked.connect(self.printItems)

        layout = QHBoxLayout()
        layout.addWidget(self.view)
        layout.addWidget(self.listItems)
        self.setLayout(layout)

    def printItems(self):
        for item in self.scene.items():
            print item, item.parentItem()

実際に何が起こるかはわかりませんが、アイテムがガベージ コレクションされているように見えaddItemますscene。これは PyQt のバグかもしれませんが、よくわかりません。

于 2012-11-15T12:09:20.743 に答える