2012-05-09 14 views
13

私はデザイナーではなくコードを使ってウィジェットのレイアウトを手動で設定しようとしていますが、間違って、私はこの警告を得るために:QWidget :: setLayout:既にレイアウトを持っているWidget ""にQLayoutを設定しようとしています

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

をし、またレイアウトは(ラベルが代わりに下の、一番上にある)台無しにされています。

これは、問題を再現するサンプルコードです:

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、単純な誤りで、この作品のすべて: QHBoxLayout * buttonLayout =新しいQHBoxLayout (); の代わりに の代わりに QHBoxLayout * buttonLayout = new QHBoxLayout(this); – user1369511

+0

PySideの鉱山と同じですが、hl = QtGui.QHBoxLayout(self)をhl = QtGui.QHBoxLayout()に変更すると、 – gseattle

答えて

6

問題は、あなたがthisの親とのレイアウトを作成しているということです。これを行うと、レイアウトがメインレイアウトのthisに設定されます。したがって、setMainLayout()に電話するのは冗長です。

15

だから私はあなたの問題は、この行であると信じて:特に

QHBoxLayout *hlayout = new QHBoxLayout(this); 

、私はこの問題は、QHBoxLayoutthisを渡していると思います。 QHBoxLayoutthisのトップレベルのレイアウトにするつもりはないので、thisをコンストラクタに渡すべきではありません。

ここで私はローカルでテストアプリにハッキングし、偉大な動作しているように私に再書き込みがあります:

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); 
} 
関連する問題