PyQt5 QWidget устанавливает фиксированную ширину на наименьший доступный размер

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

Итак, когда я добавляю виджет, есть ли способ уменьшить его до минимального размера, чтобы сохранить содержимое? Что-то в духе:

item = QPushButton("somestuff") # | QLabel | QWidget | etc
item.setFixedWidth(item.contents.size().width())

person Drew    schedule 08.04.2018    source источник


Ответы (1)


Для расчета минимальной ширины вы можете использовать QFontMetrics.

item = QPushButton("somestuff") # | QLabel | QWidget | etc
fm = QFontMetrics(item.font())
item.setFixedWidth(fm.width(item.text()))
person eyllanesc    schedule 08.04.2018
comment
Это не работает. Я получаю сообщение об ошибке: print(QFontMetrics(item.font()).width()) TypeError: width(self, str, length: int = -1): not enough arguments - person Drew; 08.04.2018
comment
Да, это работает, есть ли способ включить поля, которые были там, это изменяет размер до пиксельных краев текста? - person Drew; 08.04.2018
comment
что вы подразумеваете под полями, возможно, вы могли бы использовать: item.setFixedWidth(fm.width(" " + item.text()+" ")) или item.setFixedWidth(fm.width(item.text())+2) - person eyllanesc; 08.04.2018
comment
Ага, по существу. Увеличив ширину вдвое, он хорошо смотрится для кнопок и флажков, которые являются их основными элементами. - person Drew; 08.04.2018