2012-05-09 11 views
13

Estoy tratando de establecer el diseño de un widget manualmente a través del código (no en Designer), pero estoy haciendo algo mal, porque me sale esta advertencia:QWidget :: setLayout: Intentando establecer QLayout "" en Widget "", que ya tiene un diseño

QWidget::setLayout: Attempting to set QLayout "" on Widget "", which already has a layout

Y también el diseño está en mal estado (vea la etiqueta en la parte superior, en lugar de la parte inferior).

Este es un ejemplo de código que reproduce el problema:

Widget::Widget(QWidget *parent) : 
    QWidget(parent) 
{ 
    QLabel *label = new QLabel("Test", this); 
    QHBoxLayout *hlayout = new QHBoxLayout(this); 
    QVBoxLayout *vlayout = new QVBoxLayout(this); 
    QSpacerItem *spacer = new QSpacerItem(40, 20, QSizePolicy::Fixed); 
    QLineEdit *lineEdit = new QLineEdit(this); 
    hlayout->addItem(spacer); 
    hlayout->addWidget(lineEdit); 
    vlayout->addLayout(hlayout); 
    vlayout->addWidget(label); 
    setLayout(vlayout); 
} 
+0

WOW, todo este trabajo en sólo un simple error: QHBoxLayout * buttonLayout = new QHBoxLayout(); en lugar de: QHBoxLayout * buttonLayout = new QHBoxLayout (this); – user1369511

+0

Lo mismo que el mío en PySide, cambiando hl = QtGui.QHBoxLayout (self) a hl = QtGui.QHBoxLayout() – gseattle

Respuesta

6

El problema es que va a crear diseños con un padre de this. Cuando lo hace, establece el diseño como el diseño principal de this. Por lo tanto, es redundante llamar al setMainLayout().

15

así que creo que el problema es en esta línea:

QHBoxLayout *hlayout = new QHBoxLayout(this); 

En particular, creo que el problema está pasando en el thisQHBoxLayout. Como tiene previsto que QHBoxLayout NO sea el diseño de nivel superior de this, no debe pasar this en el constructor.

Aquí es mi re-escribir que me han pirateado en una aplicación de prueba a nivel local y parece que funcionan muy bien:

Widget::Widget(QWidget *parent) : 
    QWidget(parent) 
{ 
    QLabel *label = new QLabel("Test"); 
    QHBoxLayout *hlayout = new QHBoxLayout(); 
    QVBoxLayout *vlayout = new QVBoxLayout(); 
    QSpacerItem *spacer = new QSpacerItem(40, 20, QSizePolicy::Fixed); 
    QLineEdit *lineEdit = new QLineEdit(); 
    hlayout->addItem(spacer); 
    hlayout->addWidget(lineEdit); 
    vlayout->addLayout(hlayout); 
    vlayout->addWidget(label); 
    setLayout(vlayout); 
} 
Cuestiones relacionadas