Нечеткость Qt AdjustSize() - что она на самом деле делает?

Я сталкиваюсь со странным сценарием, когда я не понимаю вывод AdjustSize(). Я вызываю AdjustSize() для QLabel, и полученный размер не соответствует минимальномуSizeHint или sizeHint — он находится между ними. Единственный другой фактор, который я могу вообразить, — это длина текста внутри QLabel, но я получаю один и тот же результат для разной длины, так что это тоже не кажется правильным.

Вот точный сценарий:

  • У меня есть горизонтальный макет, содержащий два QLabels.

  • Одна QLabel содержит текст и имеет фиксированную ширину fw и минимальную высоту mh. Если весь текст умещается в пределах этого размера, размеры должны быть точно равными fw x mh. Если текста больше, высота должна увеличиться.

  • Второй QLabel содержит растровое изображение и всегда должен поддерживать соотношение сторон. Минимальная ширина и минимальная высота точно соответствуют исходным размерам растрового изображения. Если высота текстовой QLabel увеличивается, эта вторая QLabel должна увеличиваться как по ширине, так и по высоте, чтобы соответствовать новой высоте текстовой QLabel, сохраняя при этом соотношение сторон растрового изображения.

Кажется, это должно быть легко выполнимо. После того, как текст первого QLabel изменен (динамически на любую произвольную длину (в пределах разумного, не выходя за пределы экрана или что-то еще)), я вызываю AdjustSize() для этого первого QLabel. Затем, основываясь на полученной высоте, я рассчитываю коэффициент масштабирования, на который растровое изображение должно увеличиться, чтобы соответствовать этой высоте, и сбрасываю растровое изображение с масштабированной высотой и масштабированной шириной.

Проблема в том, что высота текстовой QLabel не ведет себя каким-либо разумным образом, который я могу различить. Даже при значительно меньшем размере текста, чем то, что может поместиться в начальный размер, AdjustSize() все равно приводит к увеличению высоты выше этого начального минимума. Здесь я собираюсь использовать некоторые точные цифры, чтобы проиллюстрировать проблему. Минимальная высота — 385. В sizeHint указано 401, а в AdjustSize — 390. Почему sizeHint 401, если текст может легко уместиться в минимуме 385? И почему при настройке AdjustSize() выбрано значение 390, которое не соответствует ни одному из значений?


person user984792    schedule 16.02.2017    source источник
comment
Ручное управление геометрией исключает управление компоновкой. adjustSize и setGeometry не работают, когда геометрия виджета управляется компоновкой. Вместо этого вам нужно попытаться использовать макет, чтобы управлять своей этикеткой так, как вы хотите. Возможно, этот ответ и тот, на который он ссылается, могут иметь отношение к вашей ситуации.   -  person Kuba hasn't forgotten Monica    schedule 17.02.2017
comment
AdjustSize() определенно что-то здесь делает — без него qlabel сохраняет свой первоначальный размер, что во многих случаях позволяет обрезать текст.   -  person user984792    schedule 19.02.2017
comment
Пожалуйста, разместите полный, автономный пример одного файла. Он должен быть коротким — стремитесь к ‹20 строк, начиная с #include <QtWidgets>. Для объектов в макете adjustSize() не должен ничего делать IIRC. Я не могу воспроизвести ничего из этого.   -  person Kuba hasn't forgotten Monica    schedule 19.02.2017