Свопинг одного виджета с другим в QT

Что лучший способ состоит в том, чтобы "подкачать" тот QGraphicsWidget с другим в существующем представлении? У меня есть виджет структурного вида и виджет маркировки, и я хочу, чтобы они заняли то же место в разное время. А именно, когда существует ошибка, я хочу показать его в маркировке, и когда нет никакой ошибки, я хочу показать дерево.

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

В Java Swing я использовал бы a CardLayout для достижения этого но я не вижу эквивалент в QT.

ОБНОВЛЕНИЕ: Я обнаружил QStackedWidget. Однако я работаю с a QGraphicsScene и таким образом, мои виджеты не наследовались QWidget а скорее QGraphicsWidget, таким образом, я не могу добавить их к a QStackedWidget.

6
задан Rob H 10 March 2010 в 21:25
поделиться

4 ответа

Когда вы добавляете QWidget в макет, владелец макета не становится владельцем вашего виджета. Для этого вы должны добавить свой виджет как дочерний элемент другого QWidget (обычно передайте родительский элемент в конструкторе дочернего элемента).

Таким образом, удаление виджета из Lyout удалит его только из поведения отображения владельца макета.

В вашем случае вы можете удалить виджет из макета и скрыть его. Если вы хотите отобразить его снова, покажите его и добавьте виджет в макет. Чтобы вставить его в нужное место, вы должны сохранить его место при извлечении.

Надеюсь, что это поможет

0
ответ дан 17 December 2019 в 07:03
поделиться

Есть нечто, называемое QGraphicsAnchorLayout . Вы определяете «якоря» (расстояние между краями или углами элементов), поэтому вы можете попробовать определить те же якоря для своего дерева и метки и соответствующим образом скрыть виджеты. Поскольку оба виджета будут занимать одну и ту же область, после скрытия одного элемента не должно быть промежутка.

1
ответ дан 17 December 2019 в 07:03
поделиться

Как насчет QStackedWidget ?

Класс QStackedWidget предоставляет стек виджетов, в котором одновременно виден только один виджет.

2
ответ дан 17 December 2019 в 07:03
поделиться

Вы можете довольно легко эмулировать QStackedWidget самостоятельно. Создайте свой собственный виджет (как угодно, либо из QWidget, либо из QGraphicsWidget) и поместите его туда, где вы хотите видеть два разных виджета. Поместите туда свои виджеты и позвольте ему контролировать, какой из них будет виден. Немного поработав, вы даже можете сделать его достаточно общим, чтобы использовать его как QGraphicsWidget версию QStackedWidget.

1
ответ дан 17 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: