Russian Qt Forum

Qt => Общие вопросы => Тема начата: n4ela от Январь 31, 2010, 01:58



Название: Layout и Spacer надо ли удалять?
Отправлено: n4ela от Январь 31, 2010, 01:58
Если у Layout не задан родитель, то надо ли удалять его вручную?
А у QPaserItem вобще нельзя задать родителя, при разрушении объекта он сам удалится?


Название: Re: Layout и Spacer надо ли удалять?
Отправлено: pastor от Январь 31, 2010, 02:14
А какой смысл от лайаута, если он некому не устанавливается?

Если  не задается парент, зачит всеравно где-то вызывается QWidget::setLayout и этот виджет будет следить за его удалением.


Название: Re: Layout и Spacer надо ли удалять?
Отправлено: n4ela от Январь 31, 2010, 02:20
Ну например:
Код
C++ (Qt)
verticalLayoutMain = new QVBoxLayout( this );
verticalLayoutMain->addWidget( scrollArea );
horizontalLayoutButton = new QHBoxLayout();
horizontalSpacer = new QSpacerItem( 40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
horizontalLayoutButton->addItem( horizontalSpacer );
horizontalLayoutButton->addWidget( addButton );
horizontalLayoutButton->addWidget( chancelButton );
verticalLayoutMain->addLayout( horizontalLayoutButton );

У horizontalLayoutButton который располагает кнопки внутри себя не задан родитель.
А спейсер прижимает их к нужному краю.


Название: Re: Layout и Spacer надо ли удалять?
Отправлено: pastor от Январь 31, 2010, 02:33
1) horizontalLayoutButton будет следить за спейсером и кнопками.
2) verticalLayoutMain будет следить за horizontalLayoutButton и scrollArea
3) а уж главный виджет будет следить за verticalLayoutMain

В ассистанте про все это написано:

Цитировать
void QLayout::addItem ( QLayoutItem * item )   [pure virtual]
Implemented in subclasses to add an item. How it is added is specific to each subclass.
This function is not usually called in application code. To add a widget to a layout, use the addWidget() function; to add a child layout, use the addLayout() function provided by the relevant QLayout subclass.
Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it.


Цитировать
void QLayout::addWidget ( QWidget * w )
Adds widget w to this layout in a manner specific to the layout. This function uses addItem().


Название: Re: Layout и Spacer надо ли удалять?
Отправлено: n4ela от Январь 31, 2010, 02:39
Спасибо, теперь понятно.
А получается что даже если кнопки создаются без родителей ( chancelButton = new QPushButton() ) но привязаны к layout, при разрушение layout, память из под кнопок то же очистится?



Название: Re: Layout и Spacer надо ли удалять?
Отправлено: pastor от Январь 31, 2010, 02:42
да