Множество различных функций Qt получат право собственности на передаваемый объект, что означает, что он берет на себя управление всем управлением памятью и освобождает его после удаления. Из setLayout документов:
QWidget станет владельцем макета.
После того, как вы вызвали setLayout
, у него есть родитель, и его родитель удаляет его в дополнение к его удалению при очистке стека метода. Таким образом, он удаляется дважды, что вызывает проблемы.
Если все остальное правильно, это изменение должно исправить это:
QVBoxLayout *layout = new QVBoxLayout();
//...
layout->addWidget(&testButton);
//...
editWindow.setLayout(layout);
Также обратите внимание, что обычно создается основной виджет, а затем назначается виджет, который будет отображаться в этом виджете как родительский. Другими словами, я бы ожидал чего-то более похожего на следующее (хотя это и не обязательно). Это также помогает гарантировать, что если в будущем что-то будет восстановлено, у вас не возникнет проблем:
QWidget editWindow;
QVBoxLayout *layout = new QVBoxLayout();
QPushButton *testButton = new QPushButton(&editWindow);
layout->addWidget(testButton);
editWindow.setLayout(layout);
editWindow.show();
int val = app.exec();
Большинство объектов Qt, которые переопределяются и с которыми могут произойти изменения владельца, будут иметь конструктор, который принимает QWidget*
или QObject*
.