Пример Qt FlowLayout - как получить sizeHint для вызова при изменении макета? - PullRequest
1 голос
/ 24 апреля 2019

Я хочу расположить несколько макетов QPushButton в макете, чтобы они обтекали по горизонтали (как текст).Я пытаюсь использовать пример Qt FlowLayout в PySide2.

Я разместил простой пример ревизия 2 здесь

(Это основано на официальном примере здесь , поэтому я так обеспокоен, что он не работает должным образом.)

В частности, он работает хорошо, когда окно достаточно большое:

window works well when large wide window works well when large tall

, но не препятствует уменьшению размера окна, в то время как VBoxLayout или GridLayout будет:

window can be resized too small

Я думаю, что минимальный размер должен зависеть от текущей ширины.Это должен быть минимальный размер:

wide minimum size

, и так должно быть:

narrow minimum size is tall

Как я могу получить макет, чтобы его родительский размер не был настолько мал, чтобы его содержимое не было видно?

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 .Иногда это работает, но есть несколько проблем:

  1. Когда макет создается впервые, возникают постоянные вызовы update ().Я думаю, что вызов update () инициирует вызов heightForWidth (), и по какой-то причине переданная ширина не близка к "oldWidth", которую я вычисляю, пока не изменит размер окна, даже на один пиксель.

  2. Как только я изменяю размер окна, вызовы heightForWidth () полностью прекращаются, и minSize () перестает вызываться, и я больше не могу изменить размер моего окна меньше, чем последний вычисленный размер.Я понятия не имею, почему.

  3. (Гораздо менее важно) self.geometry().width() - 2 * self.contentsMargins().top() не возвращает ширину, которая в последний раз передавалась в heightForWidth (даже если поля top / bottom / left / right являютсяидентичны), хотя я взял это из другого кода в примере.Обычно это не имеет значения, но при определенной ширине это вызывает множество вызовов update ()

Полагаю, я все делаю неправильно.Можно ли это сделать правильно?

...