После некоторого исследования я нашел «частичное» решение проблемы.
Если вы создаете макет и управляете им с помощью виджета, этот макет можно получить позже в коде, используя динамические свойства Qt. Теперь, чтобы использовать QWidget :: setProperty (), объект, который вы собираетесь хранить, должен быть зарегистрированным мета-типом. Указатель на QHBoxLayout не является зарегистрированным мета-типом, но есть два обходных пути. Самый простой обходной путь - зарегистрировать объект, добавив его в любое место кода:
Q_DECLARE_METATYPE(QHBoxLayout*)
Второй способ - обернуть объект:
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);
Или так, если вы использовали второй обходной путь:
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;
Этот подход применим только при создании макета. Если вы не создали макет и не установили его, то не существует простого способа получить его позже. Также вам придется отслеживать макет и обновлять свойство manageLayout при необходимости.