我使用并修改了以下示例代码:
void MyScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
myPath = new QGraphicsPathItem();
previous = event->scenePos();
QPainterPath p;
p.moveTo(previous);
myPath->setPath(p);
this->addItem(myPath);
}
void MyScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if(myPath)
{
QPainterPath path = myPath->path();
previous = event->scenePos();
path.lineTo(previous);
myPath->setPath(path);
}
}
它是一个简单的草图系统的一部分'。我发现奇怪的是指针:
QGraphicsPathItem *myPath;
不接受构造函数或允许:
myPath = new QGraphicsPathItem(this); // this code will fail - why?
我原本以为这有助于清理/删除指针。为什么这不会泄漏内存?或者是吗?我在QTCreator中使用过Valgrind,它似乎没有显示任何内存泄漏。我应该在某个地方:
delete(myPath); // is this needed?
任何人都可以解释或指出何时需要删除的简明解释请具体在QT内。我正在研究QPointer和QSharedPointer,这可能是一种更好的方法。
我发现Valgrind很难在命令行上使用QTCreator创建的应用程序,因为它似乎与正在创建的GUI对象混淆并吐出数百和数百行。从QTCreator中我已经用简单的案例测试了valgrind,它只是指向正确的线条而没有别的 - 更容易。没有上面的那一行:
delete(myPath); // is this needed?
Valgrind似乎没有显示内存泄漏。为什么呢?
我可以在QtCreator中信任Valgrind多少钱?
答案 0 :(得分:1)
我不是Qt的专家,但我认为MyScene
继承自QGraphicsScene。在这种情况下,addItem()取得myPath
的所有权,并在需要时delete
。
只要您已将QGraphicsPathItem
的所有权传递给其他某个对象,您就不必删除它,但到目前为止,您负责记忆。请注意未调用addItem()
的代码路径,因为您可能需要调用delete
。例如,如果抛出异常。
这种模式有点过时,但在基于场景图的图形框架中仍然很常见。