Turn On Blog

ぺーぺーSEの色々メモ

【Qt】実行時に、メッセージ「QLayout: Attempting to add QLayout "" to MyWidget "", which already has a layout」が出るとき

実行時にこんな出力がでました

QLayout: Attempting to add QLayout "" to MyWidget "", which already has a layout

なにをしてたか

QLayoutをつくって、QWidgetにsetLayoutしてました。
こんなかんじのMyWidgetをつくろうとして、
f:id:taurano:20150311222557p:plain

こんなかんじのコードをかいてました。

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
	QVBoxLayout *layout = new QVBoxLayout(this);
	this->setLayout(layout);
	
	QWidget *innerWidget = new QWidget(this);
	QVBoxLayout *innerLayout = new QVBoxLayout(this);
	innerWidget->setLayout(innerLayout);
	
	layout->addWidget(innerWidget);
	
}

何がダメだったのか

QLayout: Attempting to add QLayout "" to MyWidget "", which already has a layout

つまり、「もうレイアウトがあるMyWidgetにレイアウトをつけてるよ」って言われている。

QLayoutの生成時に渡す引数parentは、生成する対象のレイアウトをセットするウィジェットを渡します。
つまり、innerLayoutの生成時には、innerWidgetへのポインタをparentとして指定する必要があります。

修正後コード

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
	QVBoxLayout *layout = new QVBoxLayout(this);
	this->setLayout(layout);
	
	QWidget *innerWidget = new QWidget(this);
//	QVBoxLayout *innerLayout = new QVBoxLayout(this);
	QVBoxLayout *innerLayout = new QVBoxLayout(innerWidget);
	innerWidget->setLayout(innerLayout);
	
	layout->addWidget(innerWidget);
	
}

innerLayoutのコンストラクタに、thisではなくinnerWidgetをわたしました。
メッセージがでなくなりました。わーい。

なんでもかんでもthisを渡せばよいわけではなく、
Widget, object同士の親子関係を見て適切なparentを渡さないとなあと反省しました。