Динамически добавлять пользовательский виджет в запеченный макет

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

Я создал собственный виджет (и сделал несколько вариаций с рамкой и закрепляемым виджетом), чтобы попытаться получить желаемое поведение. Когда я добавляю этот виджет в новый макет (я пробовал оба QVBoxLayout и QGridLayout) и приказываю фрейму использовать этот макет, никакой виджет не отображается, однако, если я создаю вариант фрейма виджета и связываю его с фреймом в конструкторе (он же новый CustomWidget (this-> ui-> my_frame);) он отображается, но явно не следует макету (не расширяется). Никакая другая комбинация моего пользовательского виджета (например, QWidget, QFrame или QDockableWidget) не будет отображаться в моем кадре, и, если это не так, он не расширяется с событиями изменения размера окна.

Я читал в некоторых местах, что переопределение функции события изменения размера главного окна может решить эту проблему, но это только в тех случаях, когда я не использую макет — я бы предпочел использовать макет.

Я могу получить желаемый результат, если использую фиксированный контент и QTabWidget, но клиент, для которого я создаю это приложение, очень предпочел бы, чтобы я не использовал вкладки. Программное обеспечение их конкурентов использует вкладки, и мы оба согласны, что это выглядит неуклюже.

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

0

Решение

Если я правильно понимаю ваше описание, у вас есть главное окно с пустым QFrame, которое вы хотите использовать для динамического добавления других QWidget во время выполнения.

При добавлении новых дочерних QWidgets в заполнитель QFrame вы должны добавить их в QLayout заполнителя QFrame, а не в главное окно, если вы хотите, чтобы они автоматически размещались и изменяли размеры.

0

Другие решения

Я бы предложил попробовать начать с подкласса простого виджета (например, QLabel с некоторым текстом) и использовать его в своем коде, чтобы увидеть, работает ли он. Возможно, вам нужно добавить код для обработки того, что Qt ожидает от виджета, и это уже обрабатывается существующими виджетами.

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

Например:

Макеты — это элегантный и гибкий способ автоматического размещения дочерних виджетов в своем контейнере. Каждый виджет сообщает свои требования к размеру макету через свойства sizeHint и sizePolicy, и макет соответственно распределяет доступное пространство.

От: Документация по виджетам и макетам

0