いくつかの調査の後、問題の「部分的な」解決策を見つけました。
レイアウトを作成し、それを使用してウィジェットを管理している場合は、Qt の動的プロパティを使用してコードの後半でこのレイアウトを取得できます。ここで、QWidget::setProperty() を使用するには、保存するオブジェクトが登録済みのメタ タイプである必要があります。QHBoxLayout へのポインターは登録済みのメタ タイプではありませんが、2 つの回避策があります。最も簡単な回避策は、コードの任意の場所にこれを追加してオブジェクトを登録することです。
Q_DECLARE_METATYPE(QHBoxLayout*)
2 番目の回避策は、オブジェクトをラップすることです。
struct Layout {
QHBoxLayout* layout;
};
Q_DECLARE_METATYPE(Layout)
オブジェクトが登録済みのメタ タイプになったら、次の方法で保存できます。
QHBoxLayout* layout = new QHBoxLayout;
QWidget* widget = new QWidget;
widget->setProperty("managingLayout", QVariant::fromValue(layout));
layout->addWidget(widget);
または、2 番目の回避策を使用した場合は、次のようにします。
QHBoxLayout* layout = new QHBoxLayout;
QWidget* widget = new QWidget;
Layout l;
l.layout = layout;
widget->setProperty("managingLayout", QVariant::fromValue(l));
layout->addWidget(widget);
後でレイアウトを取得する必要がある場合は、次の方法で取得できます。
QHBoxLayout* layout = widget->property("managingLayout").value<QHBoxLayout*>();
またはこのように:
Layout l = widget->property("managingLayout").value<Layout>();
QHBoxLayout* layout = l.layout;
このアプローチは、レイアウトを作成した場合にのみ適用できます。レイアウトを作成して設定しなかった場合、後でそれを取得する簡単な方法はありません。また、レイアウトを追跡し、必要に応じて ManagingLayout プロパティを更新する必要があります。