Обмен одного виджета с другим в Qt - PullRequest
6 голосов
/ 10 марта 2010

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

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

В Java Swing я бы использовал CardLayout для достижения этой цели, но я не вижу эквивалента в Qt.

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

Ответы [ 4 ]

2 голосов
/ 10 марта 2010

Как насчет QStackedWidget ?

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

1 голос
/ 11 марта 2010

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

1 голос
/ 11 марта 2010

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

0 голосов
/ 10 марта 2010

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

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

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

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

...