我有一部分代码,我测试和工作,现在我想让它成为一个类,以便有一些更清洁的东西。以下代码创建一个包含矩形的场景,并将其显示在窗口小部件'graphicview'上
QGraphicsScene *scene = new QGraphicsScene;
QGraphicsRectItem *rect = new QGraphicsRectItem();
rect->setRect(0,0,100,100);
scene->addItem(rect);
ui->graphicsView->setScene(scene);
我现在想要创建一个包含这个场景的类,所以我只需要调用:
MyClass *myscene = new MyClass;
ui->graphicsView->setScene(myscene->scene)
在MyClass类中,我将有一个私有参数声明为QGraphicsScene *scene = new QGraphicsScene;
,或者只是私有参数QGraphicsScene *scene
,然后在构造函数*scene=new QGraphicsScene
中
在MyScene的析构函数中我应该删除的位置一样吗?
编辑:基于答案,我尝试在没有new
的情况下重新编写代码:
QGraphicsScene scene;
QGraphicsRectItem rect;
rect.setRect(0,0,100,100);
scene.addItem(&rect);
ui->graphicsView->setScene(&scene);
但是这段代码不起作用(widget'graphoutView'什么都没显示),我发现Qt的所有例子都使用new运算符。我错过了什么?
避免(原始)指针与性能和清晰度考虑因素一样多。例如,在您的代码中,没有必要使用指针。而是将您的场景定义为您的类的成员:
class MyCalss
{
...
QGraphicsScene scene;
};
然后将其设置为视图:
MyClass myscene;
ui->graphicsView->setScene(&myscene.scene);
所以,从现在开始,在使用指针之前,先问自己这个问题,是否有必要使用指针?如果你必须使用指针,也可以考虑smart pointers。
新的和删除没有“特定”的地方。它完全取决于你需要动态分配内存的位置(新),一旦动态分配内存(变量)的作业结束,你需要释放(删除),记住该变量不会在其他任何地方使用因为它会导致不良行为。
如果在创建类的每个对象时,需要在开始时动态分配类变量,请在构造函数中执行。类似地,如果变量在整个对象生命周期中使用,请在析构函数中删除它。这只是一个非常高级的想法。我建议阅读this,并阅读有关指针(智能指针)和动态内存分配的更多信息