быстрый вопрос. Там какой-либо путь состоит в том, чтобы (легко) получить родительское расположение виджета в QT?
PS: QObject:: родитель () не будет работать по логическим причинам.
Править: Я положителен, что виджет имеет родительское расположение, потому что я добавил его к расположению ранее в коде. Теперь, у меня есть много других разметок в окне и в то время как для меня возможно отслеживать их, я просто хочу знать, существует ли простой и очевидный способ для получения родительского расположения.
EDIT2: Извините, "легкий и чистый" был, вероятно, не лучший способ поместить. Я означал использовать QT API.
EDIT3: я добавляю виджет к расположению как это:
QHBoxLayout* расположение = новый QHBoxLayout;
расположение-> addWidget (кнопка);
После некоторого исследования я обнаружил «частичное» решение проблемы.
Если вы создаете макет и управляете с его помощью виджетом, можно получить этот макет позже в коде, используя динамические свойства 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.
Мой единственный совет - используйте widget.parent (). Layout () и перебор поиска (включая рекурсию). Может быть, вы можете выполнить поиск по "имени".
Я думаю, что тогда это нелегко. Поскольку виджет технически может содержаться в нескольких макетах (например, горизонтальный макет, который выровнен внутри вертикального макета).
Просто помните, что родительский элемент QWidget не изменяется, если он выровнен в макете.
Тогда, возможно, вам придется следить за этим самостоятельно.
Вы пробовали это? Не забудьте проверить значение NULL.
QLayout *parent_layout = qobject_cast< QLayout* >( parent() );
Если parent_layout
равно NULL, то родительский виджет не является макетом.