2012-04-17 20 views
11

Estaba viendo el ejemplo here, y me preguntaba si no hay pérdidas de memoria. Tengo rojo el artículo hablando de la materia mem leak on delete. Sin embargo, aunque QWidgets conserva la propiedad del widget añadido a, el diseño no.¿El propietario de QBoxLayout se convierte en el propietario de todos los widgets de diseño?

Parece que, a partir del código QT, el elemento primario con el diseño obtiene la propiedad de todos los widgets para este diseño. Sin embargo, no pude ver ninguna referencia de esto en los documentos.

Window::Window() 
{ 
editor = new QTextEdit(); 
QPushButton *sendButton = new QPushButton(tr("&Send message")); 

connect(sendButton, SIGNAL(clicked()), this, SLOT(sendMessage())); 

QHBoxLayout *buttonLayout = new QHBoxLayout(); 
buttonLayout->addStretch(); 
buttonLayout->addWidget(sendButton); 
buttonLayout->addStretch(); 

QVBoxLayout *layout = new QVBoxLayout(this); 
layout->addWidget(editor); 
layout->addLayout(buttonLayout); 

setWindowTitle(tr("Custom Type Sending")); 
} 
+0

Aunque las clases derivadas no lo mencionan, la clase de diseño base (QLayout) dice que 'addWidget' llama a' addItem' ... y 'addItem' dice: *" ** Nota: ** La propiedad del elemento se transfiere al diseño, y es responsabilidad del diseño eliminarlo. "* http://doc.qt.nokia.com/4.7-snapshot/qlayout.html # addItem – HostileFork

+0

@HostileFork la propiedad del * elemento * se transfiere al diseño. No es la propiedad del widget en sí. Ver mi [respuesta] (http://stackoverflow.com/a/38003370/1951907) que trata de aclarar este punto. – Boris

Respuesta

15

De Layout Management:

Consejos para usar Presentaciones

Cuando se utiliza un diseño, no es necesario pasar un padre cuando la construcción de los widgets hijos. El diseño automáticamente reparará los widgets (utilizando QWidget :: setParent()) para que sean elementos secundarios del widget en el que está instalado el diseño.

Nota: Los widgets en un diseño son elementos secundarios del widget en el que está instalado el diseño , no del diseño en sí. Los widgets solo pueden tener otros widgets como elemento principal, no diseños.

Puede anidar diseños usando addLayout() en un diseño; el diseño interior se convierte en un elemento secundario del diseño en el que se inserta.

+1

No busqué este. Gracias por su respuesta. – Anton

+0

Como nota adicional a esto, "propiedad" sin embargo se da al diseño, mientras que la asignación principal se realiza al widget principal del diseño: http://doc.trolltech.com/4.7/qlayout.html#addItem – jdi

+0

@jdi la propiedad del * elemento * se transfiere al diseño. No es la propiedad del widget en sí. Ver mi [respuesta] (http://stackoverflow.com/a/38003370/1951907) que trata de aclarar este punto. El propietario de un QWidget (en el sentido de administración de memoria) siempre es su widget padre y, por lo tanto, no puede ser un diseño. – Boris

2

No, QLayouts no se hace cargo de QWidgets administrados.

Aquí es la implementación de addWidget():

void QLayout::addWidget(QWidget *w) 
{ 
    addChildWidget(w); 
    addItem(QLayoutPrivate::createWidgetItem(this, w)); 
} 

Explicación:

  1. addChildWidget() simplemente asegura que el administrado widget de w se retira de otros diseños.

  2. createWidgetItem(this, w) asigna un nuevo QWidgetItem. Este QWidgetItem almacena un puntero a w, pero no toma posesión de w.

  3. addItem() añade el artículo a la disposición, y toma posesión de la QWidgetItem (no de la QWidget observado por el QWidgetItem). Esto significa que QWidgetItem se destruirá cuando se destruya QLayout. Sin embargo, el QWidget w aún no se destruirá.

El QWidget se destruirá cuando se destruya su QWidget padre. QLayout asigna automáticamente dicho padre cuando se llama a parent-> setLayout (layout).

Cuestiones relacionadas