Я хочу расположить несколько макетов QPushButton в макете, чтобы они обтекали по горизонтали (как текст).Я пытаюсь использовать пример Qt FlowLayout в PySide2.
Я разместил простой пример ревизия 2 здесь
(Это основано на официальном примере здесь , поэтому я так обеспокоен, что он не работает должным образом.)
В частности, он работает хорошо, когда окно достаточно большое:
, но не препятствует уменьшению размера окна, в то время как VBoxLayout или GridLayout будет:
Я думаю, что минимальный размер должен зависеть от текущей ширины.Это должен быть минимальный размер:
, и так должно быть:
Как я могу получить макет, чтобы его родительский размер не был настолько мал, чтобы его содержимое не было видно?
sizeHint () иimumSize () всегда возвращают размеродного предмета, который я считал проблемой.Однако, если я переписываю их, чтобы учесть все элементы с текущей шириной макета, это не имеет значения, потому что оба вызываются только один раз, когда я создаю и заполняю макет.
Моя лучшая идея на данный момент - вызывать update () из heightForWidth (), примерно так:
def heightForWidth(self, width):
oldWidth = self.geometry().width() - 2 * self.contentsMargins().top()
oldHeight = self.doLayout(QtCore.QRect(0, 0, oldWidth, 0), True)
height = self.doLayout(QtCore.QRect(0, 0, width, 0), True)
print 'heightForWidth', width, oldWidth, height, oldHeight
if height != oldHeight:
self.update()
return height
полный пример с изменениями в minimalSize и doLayout ревизия 3 .Иногда это работает, но есть несколько проблем:
Когда макет создается впервые, возникают постоянные вызовы update ().Я думаю, что вызов update () инициирует вызов heightForWidth (), и по какой-то причине переданная ширина не близка к "oldWidth", которую я вычисляю, пока не изменит размер окна, даже на один пиксель.
Как только я изменяю размер окна, вызовы heightForWidth () полностью прекращаются, и minSize () перестает вызываться, и я больше не могу изменить размер моего окна меньше, чем последний вычисленный размер.Я понятия не имею, почему.
(Гораздо менее важно) self.geometry().width() - 2 * self.contentsMargins().top()
не возвращает ширину, которая в последний раз передавалась в heightForWidth (даже если поля top / bottom / left / right являютсяидентичны), хотя я взял это из другого кода в примере.Обычно это не имеет значения, но при определенной ширине это вызывает множество вызовов update ()
Полагаю, я все делаю неправильно.Можно ли это сделать правильно?