Что лучший способ состоит в том, чтобы "подкачать" тот QGraphicsWidget
с другим в существующем представлении? У меня есть виджет структурного вида и виджет маркировки, и я хочу, чтобы они заняли то же место в разное время. А именно, когда существует ошибка, я хочу показать его в маркировке, и когда нет никакой ошибки, я хочу показать дерево.
Я попытался программно скрыть один и показать другой с hide()
и show()
, но проблема состоит в том, что скрытый виджет занимает место в моем QGraphicsLinearLayout
даже когда это скрыто, оставляя пустой разрыв. С другой стороны, я предполагаю, что мог добавить и удалить виджеты из расположения, но это кажется властным, так как оно подразумевает изменение во владении виджетов, и я должен был бы записать их положение в расположении, таким образом, я мог вставить их назад в правильное место.
В Java Swing я использовал бы a CardLayout
для достижения этого но я не вижу эквивалент в QT.
ОБНОВЛЕНИЕ: Я обнаружил QStackedWidget
. Однако я работаю с a QGraphicsScene
и таким образом, мои виджеты не наследовались QWidget
а скорее QGraphicsWidget
, таким образом, я не могу добавить их к a QStackedWidget
.
Когда вы добавляете QWidget в макет, владелец макета не становится владельцем вашего виджета. Для этого вы должны добавить свой виджет как дочерний элемент другого QWidget (обычно передайте родительский элемент в конструкторе дочернего элемента).
Таким образом, удаление виджета из Lyout удалит его только из поведения отображения владельца макета.
В вашем случае вы можете удалить виджет из макета и скрыть его. Если вы хотите отобразить его снова, покажите его и добавьте виджет в макет. Чтобы вставить его в нужное место, вы должны сохранить его место при извлечении.
Надеюсь, что это поможет
Есть нечто, называемое QGraphicsAnchorLayout . Вы определяете «якоря» (расстояние между краями или углами элементов), поэтому вы можете попробовать определить те же якоря для своего дерева и метки и соответствующим образом скрыть виджеты. Поскольку оба виджета будут занимать одну и ту же область, после скрытия одного элемента не должно быть промежутка.
Как насчет QStackedWidget ?
Класс QStackedWidget предоставляет стек виджетов, в котором одновременно виден только один виджет.
Вы можете довольно легко эмулировать QStackedWidget
самостоятельно. Создайте свой собственный виджет (как угодно, либо из QWidget
, либо из QGraphicsWidget
) и поместите его туда, где вы хотите видеть два разных виджета. Поместите туда свои виджеты и позвольте ему контролировать, какой из них будет виден. Немного поработав, вы даже можете сделать его достаточно общим, чтобы использовать его как QGraphicsWidget
версию QStackedWidget
.