如果我有一个QGraphicsItem,我想把它放在一个QGraphicsItemGroup中,在一个循环......就这样:
for(int i =0; i < 2; i++)
{
for(int j = 0; j < 2; j++)
{
QPixmap p(imwidth, imheight);
p.fill(Qt::gray);
QGraphicsPixmapItem *ipi = new QGraphicsPixmapItem(p);
group->addToGroup(ipi);
}
}
是否有必要将该项放在堆上,或者我可以将其作为堆栈变量并期望它仍然在组中可见,该组在for循环之外声明?
答案 0 :(得分:3)
addToGroup
方法接受一个指针,所以你无法通过它传递任何其他东西。它不会复制传入的对象,只存储指针。
如果你给它一个指向堆栈分配对象的指针,它会迟早试图访问堆栈内存,这将从那时起(可能)被覆盖,即使它(奇迹般地)没有被覆盖,无论如何,这些物体都会被摧毁 - 所以它们在任何情况下都是无效的。
答案 1 :(得分:0)
如果将QGraphicsPixmapItem声明为堆栈变量,则会在循环的每次迭代时对其进行破坏。因此,使用其地址作为QGraphicsItemGroup :: addToGroup方法的指针很可能会导致程序中的分段错误。