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

Это загадочное 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

Это почти точно равняется geomtry: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().

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

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