После некоторого исследования я нашел «частичное» решение проблемы.
Если вы создаете макет и управляете с его помощью виджетом, вы можете получить этот макет позже в коде, используя динамические свойства 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.
person
Austin
schedule
13.03.2010