Как изменить размер дочернего виджета при изменении размера родителя? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть 2 виджета, второй виджет является дочерним по отношению к первому.Я думал, что если вы измените размер родительского виджета, дочерний виджет также изменит свой размер, но это не так.Я искал в Интернете решение своей проблемы, но, возможно, я неправильно сформулировал свой вопрос при поиске решения.Я не нашел решения и поэтому написал здесь.

Что мне нужно сделать, чтобы дочерний виджет изменил свой размер при изменении размера родителя?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Причина

Чтобы автоматически реагировать на изменения размера родительского виджета, к его макету необходимо добавить дочерний виджет.

Решение

Поскольку вы не хотите использовать автоматический макет, вы должны вручную изменить размер дочернего виджета. Для этого переопределите QWidget::resizeEvent в вашем пользовательском виджете.

Пример

При условии, что у вас есть указатель на ваш дочерний виджет m_child, и этот дочерний элемент уже позиционирован и изменен, например, что-то вроде этого:

m_child->move(10, 20);
m_child->resize(60, 40);

Возможная реализация resizeEvent с сохранением полей, т. Е. Расстояния между краями дочернего элемента и краями родительского элемента, может быть следующей:

void ParentWidget::resizeEvent(QResizeEvent *event)
{
    QWidget::resizeEvent(event);

    int oldWidth = event->oldSize().width();

    if (oldWidth >= 0)
        m_child->resize(m_child->width() + event->size().width() - oldWidth,
                        m_child->height() + event->size().height() - event->oldSize().height());
}

Полный код примера, который я подготовил для вас, доступен на GitHub .

Примечание: Повторная реализация QWidget::paintEvent в примере приведена исключительно для демонстрационных целей.

0 голосов
/ 12 сентября 2018

Что ж, решение без макетов совершенно очевидно: переопределите метод resizeEvent в родительском элементе и задайте для него размер дочерних элементов.

С другой стороны, если оставить дочерний виджет в макете родительского виджета, он автоматически изменит размер вместе со своим родителем, но ваша проблема: как установить позицию дочернего виджета в выбранную координату?

Я предлагаю технику.

Скажем, вы хотите, чтобы ребенок двигался горизонтально. Присвойте родителю макет QHBoxLayout (задайте для полей макета и свойств интервала значение 0) и добавьте к нему дочерний элемент, чтобы он занимал все пространство по горизонтали. Затем добавьте QWidget к тому же макету у дочернего элемента слева: этот виджет будет действовать как заполнитель. Если вы хотите, чтобы дочерний элемент x был равен 42, установите для заполнителя width значение 42, используя его метод setFixedWidth, программно или установите для минимальной и максимальной ширины значение 42 из конструктора.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...