Qt QGraphicsView — макет, не уменьшающийся и уменьшающий размер, Минимальный размер и т. Д. не вызывается

#c #qt #qt5

#c #qt #qt5

Вопрос:

У меня есть следующая, довольно простая настройка:

В QWidget, который отображается как окно (без родительского элемента), есть один QVBoxLayout .
В этом QVBoxLayout есть один пользовательский QGraphicsView.
Для политики размера этого пользовательского QGraphicsView установлено значение Preferred / Preferred, а для setHeightForWidth установлено значение true (и перезаписано в пользовательском классе) — я хочу сохранить соотношение сторон.

Весь конструктор виджета здесь:

 graphicsView = new CustomGraphicsView();
QVBoxLayout *layout = new QVBoxLayout();
layout->setMargin(0);
QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred);
sp.setHeightForWidth(true);
graphicsView->setSizePolicy(sp);
layout->addWidget(graphicsView);
setLayout(layout);
  

Настройка работает, и соотношение сторон сохраняется при увеличении ширины окна (высота увеличивается вместе с ним).
Но как только я уменьшаю ширину окна, соотношение сторон графического представления сохраняется, но высота самого окна не уменьшается. В результате получается небольшое графическое представление с большим количеством места над и под ним, которого там не должно быть.

Исследуя его дальше, я пытался выяснить, где что-то ломается, поэтому я перегрузил все sizeHint() , MinimumSize(), minimumHeight() и т. Д. функции моего пользовательского графического представления.
Просто чтобы обнаружить, что ни один из них никогда не вызывается, пока я вручную изменяю размер окна. Единственное, что вызывается как ожидалось, это heightForWidth, которое возвращает мое вычисленное значение, но его возвращаемое значение не применяется, когда окно сжимается.

Итак, я не только не знаю, почему макет не будет уменьшаться сам по себе, несмотря на наличие предпочтительной вертикальной политики (в которой явно говорится: «Виджет можно расширить, но нет никакого преимущества в том, что он больше, чем sizeHint ()«).
Я также не знаю, как макет получает размер из виджета для начала. Я предположил, что sizeHint() поскольку вся документация постоянно ссылается на него, но в данном случае это явно неправильно.

То, что я уже пробовал, — это установить для вертикальной политики все возможные значения. Ни один из них не приведет к увеличению и сокращению окна, как предполагается.

Мой текущий обходной путь:
Я добавил функцию resizeEvent(…) В виджет, и внутри нее я вручную изменяю размер () всего виджета, если его высота превышает значение, возвращаемое функцией heightForWidth() пользовательского графического виджета.
Хорошо, что касается обходных путей, но это приводит к сильному мерцанию (как обычно при изменении размера внутри resizeEvent).

Есть идеи по любой проблеме?