Получение родительского расположения в QT

быстрый вопрос. Там какой-либо путь состоит в том, чтобы (легко) получить родительское расположение виджета в QT?

PS: QObject:: родитель () не будет работать по логическим причинам.

Править: Я положителен, что виджет имеет родительское расположение, потому что я добавил его к расположению ранее в коде. Теперь, у меня есть много других разметок в окне и в то время как для меня возможно отслеживать их, я просто хочу знать, существует ли простой и очевидный способ для получения родительского расположения.

EDIT2: Извините, "легкий и чистый" был, вероятно, не лучший способ поместить. Я означал использовать QT API.

EDIT3: я добавляю виджет к расположению как это:

QHBoxLayout* расположение = новый QHBoxLayout;

расположение-> addWidget (кнопка);

8
задан Austin 9 March 2010 в 23:14
поделиться

5 ответов

После некоторого исследования я обнаружил «частичное» решение проблемы.

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

1
ответ дан 6 December 2019 в 00:06
поделиться

Мой единственный совет - используйте widget.parent (). Layout () и перебор поиска (включая рекурсию). Может быть, вы можете выполнить поиск по "имени".

1
ответ дан 6 December 2019 в 00:06
поделиться

(Обновленный ответ)

Я думаю, что тогда это нелегко. Поскольку виджет технически может содержаться в нескольких макетах (например, горизонтальный макет, который выровнен внутри вертикального макета).

Просто помните, что родительский элемент QWidget не изменяется, если он выровнен в макете.

Тогда, возможно, вам придется следить за этим самостоятельно.

5
ответ дан 6 December 2019 в 00:06
поделиться

Вы пробовали это? Не забудьте проверить значение NULL.

QLayout *parent_layout = qobject_cast< QLayout* >( parent() );

Если parent_layout равно NULL, то родительский виджет не является макетом.

-3
ответ дан 6 December 2019 в 00:06
поделиться

Have you tried QWidget::layout() ?

-3
ответ дан 6 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: