2016-07-08 22 views
0

Ich habe eine Reihe von Widgets mit einer komplexen Beziehung. Einer von ihnen MUSS ein Objekt erstellen, von dem ich denke, dass es als ein Zeiger gespeichert werden muss. Der andere, der später erstellt wird, erhält den Zeiger auf das Element - eine QGraphicsScene - und legt es in einer Ansicht ab.Eigentum des Objekts - welches Widget sollte es löschen?

Die Frage: am Ende, wer, wenn überhaupt, sollte das Element löschen?


Widget: enthält GUI-Elemente, die Änderungen an einem QGraphicsScene* m_scene (a abgeleiteten Klasse) und seine Elemente verordnen.
MainWidget: enthält eine scrollArea, in der Widget, eine scrollArea mit QGraphicsView und eine Toolbox platziert wird. (Es ist so konzipiert, durch verschiedene Widgets wiederverwendbar sein)

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Widget* w = new Widget(); 
    MainWidget m(w); 
    m.show(); 
    return a.exec(); 
} 

MainWindow:: MainWindow(Widget *contentWidget, QWidget *parent) : QWidget(parent), 
    ui(new Ui:: MainWindow), 
    m_contentWidget(contentWidget), 
    m_canvas(contentWidget->getCanvas()) 
{ 
    ui->setupUi(this); 
    ui->myView->setScene(m_canvas); 
    ui->editArea->insertWidget(0, m_contentWidget); 
} 

Beide Klassen

haben
MyCanvas *m_canvas; 

So - auf close - das Widget sollte m_canvas löschen? Die Widget Klasse, wer ist der Besitzer oder MainWidget Klasse, die die Ansicht enthält, die die Szene enthält?

(es im Widget Löschen - der logischen Besitzer - macht Programmabsturz, meine Vermutung ist, weil MainWidget es immer noch als Teil des ui erfordert)

+0

Wenn Sie keine alte Codebasis pflegen, sollten Sie bereits Smart Pointer verwenden. Sie lösen automatisch Eigentumsprobleme und müssen sich um das jeweilige Löschen als Konsequenz kümmern. – sergiol

+0

Ich versuche herauszufinden, wie man intelligente Zeiger für mein Szenenobjekt verwendet. – Thalia

Antwort

1

Die Besitzer des Zeigers wird der derjenige ist, sollte das Löschen durchführen. Sie haben festgestellt, dass Widget der Eigentümer ist, daher ist es derjenige, der die Ressource löschen sollte.


Es scheint vernünftig, dass Widget der Besitzer ist seit m_canvas initialisiert wird mit contentWidget->getCanvas() (wo contentWidget ist vom Typ Widget), das führt mich Widget ist auch derjenige, anzunehmen, dass der new Operator genannt.

+0

Ja das ist wahr - aber ich denke, MainWidget wird verärgert, wenn die Leinwand gelöscht wird, während er immer noch eine Referenz in der Ansicht hält ... Etwas ist verärgert und stürzt ab. – Thalia

+0

@Thalia Ich sehe nicht, wie es ein Problem mit dem Code geben würde, den Sie gepostet haben. "Widget" wird nie gelöscht, was mich glauben lässt, dass die MyCanvas-Instanz nie gelöscht wird. In jedem Fall müssen Sie unbedingt sicherstellen, dass die MyCanvas-Instanz so lange lebt, wie andere sie verwenden. Dies ist wirklich eine andere Frage, die mehr Details erfordern würde, um das Problem zu lösen. –

+0

@Thalia Führt die Ausführung von ui-> myView-> setScene (nullptr) aus; 'bevor die Instanz 'MyInstance' gelöscht wird, lösen Sie Ihr Problem? –

0

Ihre Canvas-Klasse scheint von QGraphicsScene zu erben, die von QObject erbt. Solange es einen Elternteil hat, ist keine Löschung notwendig; Das übergeordnete Objekt behandelt dies.

Unabhängig davon, welche Klasse ist nicht die Eltern des MyCanvas Objekt sollte den Zeiger mit QPointer speichern gegen baumelnden Zeigern zu schützen.