Вопрос по – Как заставить макет обновить / изменить размер, когда дочерний элемент управляет изменениями размера?

11

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

Есть ли способ сказать управляющему макету пересчитать себя на основе независимого изменения размера в одном из его виджетов?

Ваш Ответ

1   ответ
23

sizeHint() а такжеminimalSizeHint() его детей (не ихsize()). Поэтому вам следует переопределить эти два виртуальных метода и вернуть размер, который вы хотите форсировать. Всякий раз, когда ваш размер подсказки изменяется,you should call updateGeometry() на вашем собственном виджете, чтобы вызвать обновление макета, в котором размещен виджет.

Смотрите документацию:

virtual QSize QWidget::sizeHint() const

This property holds the recommended size for the widget.
[...]

virtual QSize QWidget::minimumSizeHint() const

This property holds the recommended minimum size for the widget.
[...]
QLayout will never resize a widget to a size smaller than the minimum size hint unless minimumSize() is set or the size policy is set to QSizePolicy::Ignore. If minimumSize() is set, the minimum size hint will be ignored.

Итак, чтобыforce a minimum size вашего виджета, реализоватьminimumSizeHint() вернув свой минимальный размер; вforce a fixed size, реализовать оба, возвращая одинаковый размер.

Я также рекомендую прочитать следующий раздел на странице документации& quot; Управление макетами & quot;:

Custom Widgets in Layouts

When you make your own widget class, you should also communicate its layout properties. If the widget has a one of Qt's layouts, this is already taken care of. If the widget does not have any child widgets, or uses manual layout, you can change the behavior of the widget using any or all of the following mechanisms:

Reimplement QWidget::sizeHint() to return the preferred size of the widget. Reimplement QWidget::minimumSizeHint() to return the smallest size the widget can have. Call QWidget::setSizePolicy() to specify the space requirements of the widget.

Call QWidget::updateGeometry() whenever the size hint, minimum size hint or size policy changes. This will cause a layout recalculation. Multiple consecutive calls to QWidget::updateGeometry() will only cause one layout recalculation.

Update (see comments):

Вы также можете изменить размер (или только высоту / ширину), вызвав:

QWidget::setFixedSize(QSize);
QWidget::setFixedHeight(int);
QWidget::setFixedWidth(int);

Эти методы просто устанавливают подсказки по размеру для данного значения и вызываютupdateGeometry() НАСКОЛЬКО МНЕ ИЗВЕСТНО. Но, возможно, они делают немного больше, поскольку (как видно из комментариев) это был единственный способ, который я смог найти, чтобы решить проблему здесь.

Благодарю. Я добавил эти функции, но они, казалось, вызывались только при первом создании виджетов. Когда я изменяю размер макета, они больше не вызывают, даже если виджеты явно меняют размер. George
Вы джентльмен и ученый. Спасибо. :-)beeroverip.org George
Ну, это то, что я делаю. Я не одержим идеей в Qt или чем-то подобном.pastebin.com/mRNLZEAp  Я вырезал все, что не относилось к делу. Если я вызываю updateGeometry () где-либо, я теряю возможность изменять размер textedit. George
Хорошо, я получил это с помощьюsetFixedHeight вместо подсказок по размеру. Вы не нуждаетесьupdateGeometry в этом случае. Удалите размер подсказки и замените две строкиsetGeometry( x(), y(), width(), height()-h_diff ); + size_hint_ = QSize( width(), height()-h_diff ); на простой вызовsetFixedHeight(height()-h_diff);, Возникает другая проблема: если вы уменьшаете текстовую область, внешний виджет (в данном случае, окно) тоже не уменьшается. Вы должны поместить все это в виджет, который сохраняет его размер как можно меньше. Я надеюсь, что смогу помочь тебе. Я добавляю это к своему ответу.
Вы также пытались позвонитьupdateGeometry() после этого? Какой тип макета вы используете? Вы дважды проверили наличие ошибок при добавлении виджета в макет? Не используя ручку изменения размера,QTextEdit действовать как обычно для изменения макета (изменение размера родительского виджета)?

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