2012-05-09 9 views
13

Próbuję ustawić układ widżetu ręcznie za pomocą kodu (nie w Projektancie), ale robię coś źle, bo mam to ostrzeżenie:QWidget :: setLayout: Próba ustawienia QLayout "" na Widget "", który ma już układ

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

a także układ jest pomieszane (etykieta znajduje się na górze, zamiast na dole).

To jest przykładowy kod, który reprodukuje problem:

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, wszystkie tego dzieła na prawie prostego błędu: QHBoxLayout * buttonLayout = new QHBoxLayout(); zamiast: QHBoxLayout * buttonLayout = new QHBoxLayout (this); – user1369511

+0

To samo z kopalnią w PySide, zmieniając hl = QtGui.QHBoxLayout (self) na hl = QtGui.QHBoxLayout() – gseattle

Odpowiedz

6

Problemem jest to, że podczas tworzenia układów z rodzicem this. Gdy to zrobisz, ustawia układ jako główny układ this. Tak więc zbędne jest wywoływanie setMainLayout().

15

Uważam więc problem jest w tym wierszu:

QHBoxLayout *hlayout = new QHBoxLayout(this); 

W szczególności, myślę, że problem jest przechodzących this do QHBoxLayout. Ponieważ zamierzasz, aby ten QHBoxLayout NIE był układem najwyższego poziomu this, nie powinieneś przekazywać this do konstruktora.

Oto mój re-write, że włamał się do aplikacji testowej lokalnie i wydaje się doskonale:

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); 
} 
Powiązane problemy