Это загадочное sizeHint

Что такое sizeHint? (подсказка размера). sizeHint - это получится рекомендуемый размер виджета. Qt где-то в своих недрах хранит эти размеры для разных видов виджетов.

Примечательно, что функции setSizeHint не существует.

А как же он тогда устанавливается?

Оказывается sizeHint можно переопределить для виджета, чтобы конкретный виджет имел некие иные отличные размеры.

По умолчанию sizeHint вычисляется в исходниках Qt для каждого типового виджета неким типовым алгоритмом.

В принципе можно разобраться как работает, если покапаться в исходниках Qt. Проблема в том , что для разных видов виджетов sizeHint вычисляется по разному.

sizeHint для QMdiSubWindow

Например для QMdiSubWindow sizeHint по веритикали вычисляется как:

margin 7 titleBarHeight() (38) d->layout->totalSizeHint() [QSize(159, 110)] .

7 38 110=155

Это почти точно ровняется geometry:Height - geometry:Y . Тут 154 .

фотка 1
QSize QMdiSubWindow::sizeHint() const
{
    Q_D(const QMdiSubWindow);
    int margin, minWidth;
    d->sizeParameters(&margin, &minWidth);
    QSize size(2 * margin, d->titleBarHeight()   margin);
    if (d->baseWidget && d->baseWidget->sizeHint().isValid())
        size  = d->baseWidget->sizeHint();
    return size.expandedTo(minimumSizeHint());
}

Ширина sizeHint виджета QMdiSubWindow вычисляется как QStyle::SC_TitleBarLabel [30] SC_TitleBarLabel [16] ширина контролов (кнопки закрыть,максимизировать ,свернуть) [42 42 42] = 172

И это меньше чем geometry:Width- geometry:X . Тут 201-9=192 .

У нас QMdiArea горизонтально ориентированная, возможно поэтому sizeHint не учитывает ширину элементов содержания.

Кто использует sizeHint впоследствии?

Это например функция adjustSize().

Но также sizeHint использует метод updateGeometry() и это более правильный путь.

Примечание: для удобного проникновения в исходники рекомендуем собирать саму библиотеку qt из исходников, тогда вы всегда сможете прямо из отладки шагнуть внутрь исходников и посмотреть, что там делается. Сборка Qt из исходников.

Может показаться , что sizeHint есть только у виджетов, но это не так. QLayout (компоновщики) тоже имеют метод sizeHint.