2016-07-08 2 views
0

У меня есть набор виджетов со сложными отношениями. Один из них ДОЛЖЕН создать элемент, который, я думаю, должен храниться как указатель. Другой, созданный позже, получает указатель на элемент - QGraphicsScene - и помещает его в представление.Собственность на объект - какой виджет должен удалить его?

Вопрос: при закрытии, кто, если есть, должен удалить товар?


Widget: содержит элементы графического интерфейса пользователя, что ввести в действие изменения на QGraphicsScene* m_scene (производный класс) и его элементов.
MainWidget: содержит scrollArea, где он размещает Widget, scrollArea, содержащий QGraphicsView и панель инструментов. (Она предназначена для повторного использования различных виджетов)

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); 
} 

Оба класса имеют

MyCanvas *m_canvas; 

Так что - при закрытии - что виджет должен удалить m_canvas? Класс Widget, кто является владельцем, или MainWidget класс, который содержит просмотр сцены?

(удалить его в Widget - логический владельца - делает аварийное завершение программы, я думаю, потому что MainWidget все еще требуют как часть Ui)

+0

Если вы не поддерживаете старую базу кода, вы уже должны использовать интеллектуальные указатели. Они автоматически решают вопросы собственности, и, как следствие, они должны заботиться о соответствующем удалении. – sergiol

+0

Я пытаюсь понять, как использовать умные указатели для моего объекта сцены. – Thalia

ответ

1

владелец указателя является тот, который должен выполнить удаление. Вы определили, что Widget является владельцем, поэтому он должен удалить ресурс.


кажется разумным, что Widget является владельцем, поскольку m_canvas инициализируется с использованием contentWidget->getCanvas() (где contentWidget имеет тип Widget), который заставляет меня предположить Widget также является тот, который называется оператором new.

+0

Да, это правда, но я предполагаю, что MainWidget расстраивается, если холст удаляется, пока он все еще держит ссылку в представлении ... Что-то расстроено и рушится. – Thalia

+0

@Thalia Я не вижу, как возникла бы проблема с кодом, который вы опубликовали. 'Widget' никогда не удаляется, что заставляет меня думать, что экземпляр' MyCanvas' никогда не удаляется. В любом случае вам обязательно нужно убедиться, что экземпляр MyCanvas живет так долго, как другие его используют. Это действительно другой вопрос, который потребует более подробных сведений о том, как решить проблему. –

+0

@Thalia Выполняет 'ui-> myView-> setScene (nullptr);' перед удалением экземпляра 'MyInstance' разрешает вашу проблему? –

0

Ваш класс canvas наследуется от QGraphicsScene, который наследуется от QObject. Если у него есть родитель, удаление не требуется; родительский объект обрабатывает это.

Какого класса не родитель MyCanvas объекта должен хранить указатель с QPointer для защиты от оборванных указателей.

Смежные вопросы