#c #qt #qt5
#c #qt #qt5
Вопрос:
Один из наших преподавателей попросил нас создать приложение Qt без какого-либо файла пользовательского интерфейса для главного окна (QMainWindow). Обычно я всегда создаю один, оставляю его пустым и позволяю uic разобраться с ним.
Я знаю, что если родительское отношение определено между виджетом (дочерним) и его родительским, то нет необходимости удалять виджет (удаляется при удалении родительского элемента). Итак, когда пользовательский интерфейс удаляется, все дочерние элементы уничтожаются.
Если мы не используем файл пользовательского интерфейса (не созданный), нужно ли вручную удалять все виджеты, добавленные в графический интерфейс?
Небольшой пример:
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent){
layout = new QHBoxLayout(this);
aButton = new QButton(this);
layout->addWidget(aButton);
...
}
MainWindow::~MainWindow(){
delete ui; // No need to delete more if parental relation.
// However, what do we do if no ui has been generated?
// Do we have to delete aButton?
}
Значение parent равно 0. Это основная запись приложения.
Спасибо
Комментарии:
1.На самом деле неясно, о чем вы спрашиваете, но предполагается
ui
, что anullptr
delete ui;
— это NOP. Так что, похоже, все в порядке.2. Должны ли мы вручную удалять каждый виджет? Нет. Виджеты должны быть дочерними элементами родительского виджета. QObject обработает их при удалении родительского элемента.
3. Он должен иметь родительский QObject (или находиться в стеке или удален вручную …), Иначе сама MainWindow произошла бы утечка.
4. файлы .ui не делают ничего волшебного, они преобразуются в код на C , который вы могли бы написать сами (теоретически, по крайней мере). Пожалуйста, проверьте сгенерированный ui_XXX.h простого пользовательского интерфейса, чтобы получить некоторое представление.
5. Еще одна вещь, которая немного упростит вашу жизнь: addWidget, setLayout и т. Д. Сбрасывают родительский элемент, Поэтому вам не нужно указывать это как параметр конструктора при создании виджетов, макетов и т. Д.
Ответ №1:
Пожалуйста, обратитесь к этой статье
QWidget, основной класс модуля Qt Widgets, расширяет родительско-дочерние отношения. Дочерний элемент обычно также становится дочерним виджетом, т. Е. Он отображается в родительской системе координат и графически обрезается границами родительского элемента. Например, когда приложение удаляет окно сообщения после его закрытия, кнопки и ярлык окна сообщения также удаляются, как и хотелось бы, потому что кнопки и ярлык являются дочерними элементами окна сообщения.
Итак, нет никакой разницы, используете вы ui
или нет. При удалении window все его дочерние элементы также будут удалены.