我有一个名为QGraphicsItem
的{{1}},是另一个名为child_item
的{{1}}的孩子。我需要从QGraphicsItem
取消parent_item
,以便child_item
没有父母。
但是当我尝试parent_item
时,我的脚本崩溃了。
显然这是因为当您以这种方式移除child_item
的父级时,该项目将返回到Qt ...
现在我刚刚创建了一个childItem.setItemParent(None)
QGraphicsItem
,这样如果任何项目需要无需支持,我只需将其设为global_parent
,如果是QGraphicsItem
有父global_parent
我的代码将表现得像没有父母,但我想要一个更好的解决方案。
有什么想法吗?
QGraphicsItem
调用setItemParent并将项目的父项设置为另一项确实有效,所以我在此期间使用了通用父项。
答案 0 :(得分:3)
如果setParent
不是拼写错误,那么这就是你的问题。 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中的一个错误,但我不确定。